Java 更好的模式观察者?
我使用模式观察者,但发现从具有侦听器的类继承变得越来越困难。如果继承类中还存在侦听器,则很难控制哪些侦听器工作。 是否存在类似于观察者但对听者有更好控制的模式?Java 更好的模式观察者?,java,design-patterns,inheritance,listener,Java,Design Patterns,Inheritance,Listener,我使用模式观察者,但发现从具有侦听器的类继承变得越来越困难。如果继承类中还存在侦听器,则很难控制哪些侦听器工作。 是否存在类似于观察者但对听者有更好控制的模式? 谢谢。似乎您不想使用继承来实现观察者模式 如果我没有弄错上面这一点,那么您可以使用接口来实现它。只需为Subject和Observer声明两个接口,然后让您的类实现它们 例如,你的拍摄对象可能看起来像这样- public interface Subject { public void registerObserver(Obser
谢谢。似乎您不想使用继承来实现观察者模式 如果我没有弄错上面这一点,那么您可以使用接口来实现它。只需为Subject和Observer声明两个接口,然后让您的类实现它们 例如,你的拍摄对象可能看起来像这样-
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
观察员-
public interface Observer {
public void update(int age, float salary); // imaginary parameters.....
}
然后,您的具体主题可以从上述Subject
接口继承-
public class SubjectImpl implements Subject{
private ArrayList observers;
public void registerObserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void notifyObservers(){
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer)observers.get(i);
observer.update(30, 200.50); // imaginary arguments, provide your own...
}
}
}
然后你可以使用-
Subject s = new SubjectImpl();
Observer o = new ObserverImpl(s);
// do whatever you want now
这种方法当然比类继承要好,因为在这种情况下,您的主题和观察者都可以从其他类继承,从而提供更灵活的设计
如果您的问题是关于在不继承的情况下提供java侦听器实现,那么您可以使用-
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Anonymous class example");
}
};
yourButton.addActionListener(listener);
是对观测器设计模式的改进
如前所述,它在Qt(C++)中被广泛使用
这是中的相关问题和实现。对不起,我不理解您的问题。您能提供一些示例代码来演示您的观察者模式实现吗?这是观察者模式,而不是相反。撇开这一点不谈,“很难控制哪些侦听器工作”是什么意思?这是Java中已知的“问题”:观察者模式是用
Observable
抽象类实现的,这导致您无法扩展任何其他类。这是一个很好的Java面试问题。界面的选择是正确的。@Brady:是的,你说得对。但是OP说他/她正在实现该模式,所以我假设这里使用类继承,所以我认为接口继承可能是更好的选择。
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Anonymous class example");
}
};
yourButton.addActionListener(listener);