我见过一些观察者模式的例子。
为什么在某些情况下,观察者界面中的更新方法包含对被观察对象的引用?难道观察者不知道自己在观察什么物体吗?
请举例说明。
根据具体问题,它可能有也可能没有对Subject的引用。
Subject可能只调用update()函数,并在Observer中设置一些值,因此Observer不需要引用。或者,它可以通知观察者发生了更改,观察者将通过它所拥有的引用联系主题,并获得新的值。
如果观察员需要向受试者通报一些情况,也可以在实施中保留参考。
具体到您的最后一个问题,给定C#和Java作为编程语言,除了通过引用,一个对象如何"了解"另一个对象?
观察者和主体之间的关系需要存储在某个地方,在Java和C#中,如果需要对主体或观察者调用任何操作,则只能通过引用存储。
你好,Amandeep你可以阅读这篇文章,它非常有趣,你有GOF 的所有设计模式
你有类图,样本代码
它解释了关于观察的所有概念:主体、具体主体、观察者和具体观察者
http://www.dofactory.com/Patterns/PatternObserver.aspx
一个Observer
可以观察到许多Observable
,因此当他收到通知时,它可以以特定的方式处理更改。例如:
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");
}
});
快速简短回答
观察者模式可以有几种变体。
其中一个只允许检测观察对象的变化,并可能显示其属性值。其他也允许执行操作。