我使用模式Observer,但发现从类中继承很难有监听器。如果在继承类中也存在监听器非常难以控制哪些监听器工作。 是否存在类似于Observer的模式,但更好地控制了听众? 感谢。
答案 0 :(得分:2)
好像你不想使用继承来实现Observer Pattern。
如果我没有弄错上述观点,那么你总是可以使用接口实现这一点。只需为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...
}
}
}
和您的Observer
实施 -
public class ObserverImpl implements Observer{
public ObserverImpl(Subject s){
s.registerObserver(this);
}
public void update(int age, float salary){
// implementation
}
}
然后你可以使用 -
Subject s = new SubjectImpl();
Observer o = new ObserverImpl(s);
// do whatever you want now
这种方法肯定比Class Inheritance
更好,因为在这种情况下,你的主题和观察者都可以继承其他类,提供更灵活的设计。
如果您的问题是关于在没有继承的情况下提供java侦听器实现,那么您可以使用Annonymous Classes来实现此目的 -
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Anonymous class example");
}
};
yourButton.addActionListener(listener);
答案 1 :(得分:1)
Signals and Slots是Observer设计模式的改进。
它在Qt(C ++)中广泛使用,如here所述。
以下是Signals and Slots for Java的相关问题以及Java中的实施。