在观察者设计模式中,我知道我们必须向主体注册观察者。但我注意到在某些实现中,主题实例通过observer类发送,然后使用subject实例将observer的对象发送到Subject类。请参阅下面的示例
public class Observer1 extends Observer {
public Observer1(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Observer1: "
+ Integer.toBinaryString(subject.getState()));
}
}
我的问题是Observer类是否需要拥有主题实例?我认为观察者与主题完全脱钩了
有人可以给我一个很好的Observer设计模式或任何资源的实现
答案 0 :(得分:2)
理论上,Observer不需要在字段中保留Observable对象(你称之为'Subject')的引用,因为Observer通常已经将Observable对象作为update方法的参数接收。
答案 1 :(得分:0)
这是观察者模式的不良实现。主体(或观察者)应该有一组观察者,并且除了如何通知他们对其状态的改变之外,他们不需要了解它们。
Observable状态的任何更改都可以通过通知机制中的参数传播;这就是为什么Java的Observable在其notifyObservers(Object)方法中有一个额外的参数。
观察者不应该只需update
notifyObservers
来调用update
方法。请注意,在Java SDK中,{{1}}方法被赋予对Observable的引用作为参数,因此不需要将其作为Observer的数据成员。