【问题标题】:Coupling observer with subject将观察者与主体耦合
【发布时间】:2014-04-25 22:57:56
【问题描述】:

在观察者设计模式中,我知道我们必须向主题注册观察者。但是我注意到在某些实现中,主题实例是通过观察者类发送的,然后观察者的对象使用主题的实例发送到主题类。请看下面的例子

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 类是否需要有主题实例?我认为观察者与主题完全脱钩

谁能给我一个很好的观察者设计模式或任何资源的实现

【问题讨论】:

  • 在观察者模式的正确实现中,观察者和主体是“松散耦合的”,而不是“完全解耦的”。这个例子显示了强耦合,这意味着它是一个糟糕的实现。

标签: java design-patterns


【解决方案1】:

从理论上讲,Observer 不需要将 Observable 对象的引用(您称之为“Subject”)保留在字段中,因为 Observer 通常已经接收到 Observable 对象作为更新方法的参数。

【讨论】:

    【解决方案2】:

    这是观察者模式的糟糕实现。 Subject (或 Observable) 应该有一组 Observers,并且只需要知道如何通知他们其状态的变化。

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

    观察者应该不需要任何比它的update 方法更多的东西,由notifyObservers 调用。请注意,在 Java SDK 中,update 方法被赋予了对 Observable 的引用作为参数,因此无需将其作为 Observer 的数据成员。

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2011-09-25
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多