为什么在观察者模式中使用接口?

时间:2016-07-30 11:26:14

标签: design-patterns

我在书中读到应用层应该独立于表示层。设计模式就是这样的问题的解决方案。当一个对象应该能够通知其他对象而不假设那些对象是谁时,观察者模式是适用的。但是像addObserver这样的方法会将观察者添加到观察者列表中。之后,可观察到知道要通知哪些对象。以及如何使用这些列表?在我读过的书中,它说可观察的只通过应用层中定义的接口访问观察者,以便保留系统的层结构。然后界面使用该列表?如果是,有什么区别?

1 个答案:

答案 0 :(得分:1)

在这里,我删除了java.util.Observable的一个非重要部分,这个部分是为扩展而设计的,它使用Observer接口。这是Java代码,但当然任何OOP语言都可以实现这种模式。

package java.util;

public class Observable {
    private boolean changed = false;
    private Vector obs;

    public Observable() {
        obs = new Vector();
    }

    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

    public void notifyObservers() {
        notifyObservers(null);
    }

    public void notifyObservers(Object arg) {
        Object[] arrLocal;
        synchronized (this) {
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }

    protected synchronized void setChanged() {
         changed = true;
    }

}

通过Observer方法将Observable添加到addObserverObservable维护Vector s的列表(此处为Observer)。当Observable更改时,会调用setChanged(),然后调用notifyObservers()。每个Observer都调用了update()方法来对事件做一些事情。这是针对实施细节的。

现在,如果你从设计的角度来看。 Observable只知道Observer的列表。它们可以是任何东西。它们可能是异构的:用户界面,作业处理程序......他们所需要的只是实现Observer和单一方法。在Java中,这个原则在许多特定的地方实现,比如窗口工具包Swing,用于事件处理。