我在书中读到应用层应该独立于表示层。设计模式就是这样的问题的解决方案。当一个对象应该能够通知其他对象而不假设那些对象是谁时,观察者模式是适用的。但是像addObserver这样的方法会将观察者添加到观察者列表中。之后,可观察到知道要通知哪些对象。以及如何使用这些列表?在我读过的书中,它说可观察的只通过应用层中定义的接口访问观察者,以便保留系统的层结构。然后界面使用该列表?如果是,有什么区别?
答案 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
添加到addObserver
。 Observable
维护Vector
s的列表(此处为Observer
)。当Observable
更改时,会调用setChanged()
,然后调用notifyObservers()
。每个Observer
都调用了update()
方法来对事件做一些事情。这是针对实施细节的。
现在,如果你从设计的角度来看。 Observable
只知道Observer
的列表。它们可以是任何东西。它们可能是异构的:用户界面,作业处理程序......他们所需要的只是实现Observer
和单一方法。在Java中,这个原则在许多特定的地方实现,比如窗口工具包Swing,用于事件处理。