更好的模式观察者?

时间:2012-05-24 08:50:46

标签: java design-patterns inheritance listener

我使用模式Observer,但发现从类中继承很难有监听器。如果在继承类中也存在监听器非常难以控制哪些监听器工作。 是否存在类似于Observer的模式,但更好地控制了听众? 感谢。

2 个答案:

答案 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中的实施。