我看过几个观察者模式的例子。
为什么有些情况下Observer接口中的update方法包括对被观察对象的引用? 难道观察者不知道它正在观察哪个对象吗?
请举例说明。
我看过几个观察者模式的例子。
为什么有些情况下Observer接口中的update方法包括对被观察对象的引用? 难道观察者不知道它正在观察哪个对象吗?
请举例说明。
具体问题而定,它可能会或可能不会引用主题。
主题可能仅调用update()函数并在观察者中设置某些值,因此观察者不需要引用。或者它可以通知观察者已经发生了变化,观察者将通过它所拥有的引用联系主题并获得新值。
在实现中持有引用还可以用于观察者需要通知主题关于某些事情。
import java.util.Observable;
import java.util.Observer;
public class ObserverSample {
static class ObservableExtension extends Observable {
void doSomething() {
setChanged();
notifyObservers();
clearChanged();
}
}
public static void main(final String[] args) {
final ObservableExtension observable1 = new ObservableExtension();
final Observable observable2 = new ObservableExtension();
final Observer observer = new Observer() {
@Override
public void update(final Observable o, final Object arg) {
if (o == observable1)
System.out.println("This is the first observable");
else if (o == observable1)
System.out.println("This is the second observable");
else
System.out.println("This is another observable");
}
};
observable1.addObserver(observer);
observable2.addObserver(observer);
observable1.doSomething();
}
}
然而,我不喜欢这种方法(唯一的优点是更小的内存占用),我更喜欢使用单一职责的不同观察者。
observable1.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("This is the first observable");
}
});
observable2.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("This is the second observable");
}
});
你好,Amandeep,你可以阅读这篇文章,它非常有趣,包含了GOF的所有设计模式。
你将看到类图和示例代码。
它解释了关于观察者模式的所有概念:主题、具体主题、观察者和具体观察者。
简短回答
观察者模式有几种变体。
其中一种只允许检测被观察对象的更改,并可能显示它们的属性值。其他变体还允许执行操作。