将观察者与主体联系起来

时间:2014-04-25 13:58:13

标签: java design-patterns

在观察者设计模式中,我知道我们必须向主体注册观察者。但我注意到在某些实现中,主题实例通过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设计模式或任何资源的实现

2 个答案:

答案 0 :(得分:2)

理论上,Observer不需要在字段中保留Observable对象(你称之为'Subject')的引用,因为Observer通常已经将Observable对象作为update方法的参数接收。

答案 1 :(得分:0)

这是观察者模式的不良实现。主体(或观察者)应该有一组观察者,并且除了如何通知他们对其状态的改变之外,他们不需要了解它们。

Observable状态的任何更改都可以通过通知机制中的参数传播;这就是为什么Java的Observable在其notifyObservers(Object)方法中有一个额外的参数。

观察者不应该只需update notifyObservers来调用update方法。请注意,在Java SDK中,{{1}}方法被赋予对Observable的引用作为参数,因此不需要将其作为Observer的数据成员。