【问题标题】:Better pattern observer?更好的模式观察者?
【发布时间】:2012-05-24 08:50:45
【问题描述】:

我使用模式观察者,但发现从具有监听器的类继承变得越来越困难。如果在继承的类中也存在侦听器,则很难控制哪些侦听器工作。 是否存在类似于观察者但更好地控制听众的模式? 谢谢。

【问题讨论】:

  • 对不起,我不明白你的问题。您能否提供一些示例代码来演示您的观察者模式实现?
  • 这是观察者模式,而不是相反。撇开这些不谈,“很难控制哪些听众工作”是什么意思?

标签: java design-patterns inheritance listener


【解决方案1】:

好像你不想使用继承来实现观察者模式。

如果我在上述观点上没有记错的话,那么您总是可以使用接口来实现这一点。只需为 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);

【讨论】:

  • 这是 Java 中一个已知的“问题”:观察者模式是用 Observable 抽象类实现的,这导致您无法扩展任何其他类。这是一个很好的 Java 面试问题。界面替代方案是要走的路。
  • @Brady:是的,你是对的。但是 OP 说他/她正在实现该模式,所以我假设这里使用了类继承,所以我认为接口继承可能是一个更好的选择。
【解决方案2】:

Signals and Slots 是对观察者设计模式的改进。

here 所述,它在 Qt (C++) 中被广泛使用。

这是Signals and Slots for Java 的相关问题和Java 中的实现。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2013-02-12
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多