观察者修改对象状态时使用观察者模式



我有一个类C,它附有观察者、AB。观察者B修改它接收的对象的状态,然后必须将其通知回A。到目前为止,我只是从观察者B再次调用类C notifyObservers(),但这有几个问题:

  • 难以理解
  • B需要忽略第二个更新,因为它引发了更新

我最初的想法是让B通知自己的观察员,A也注册为B观察员。

有没有更好的方法可以做到这一点?我应该使用不同的模式来实现这一点吗?

也许调解器模式就是您正在寻找的。

在此模式中,您有一个控制器,用于处理多个(不同)同事对象之间的通信。同事们直接认识他们的主管,他们只和他们沟通。主任管理同事。因此,它将同事对象解耦并简化了通信协议。

也许您可以根据需要对其进行调整。

你可能不应该引入观察者观察者(B观察A)。这听起来不像是一个有趣的编写或调试时间。

我猜你在这里拥有的是循环依赖。当观察者需要反映被观察者的当前状态,但它们没有直接关系时,观察者模式非常有效。在我看来,在这种特殊情况下,A 与 C 有直接关系,因为 A 对 C 有足够的了解来改变其状态,但你依靠观察者模式将信息从 C 传播到 A,这些信息可以直接传播。事实上,你现在有不同的事件"种类"——A生成的事件和"其他"——也表明C和A之间的关系不是C和B之间的观察者/观察者关系。C和A的关系也是一对一的吗?这将进一步证明您只是在这里应用了错误的模式。另一方面,如果一个 B 可以为多个 C 提供服务,反之亦然,这证明 B 和 C 是观察者/被观察者。

我已经在我自己的代码中看到过这种情况,当时看起来我有递归,因为我的 C 在我的 A 的要求下更改,然后导致 C 发送另一个事件,导致 A 再次采取相同的操作。我当时找到的解决方案,我不是特别喜欢,是引入不同的观察者"类别",并为每个类别维护单独的观察者列表和本质上不同类型的事件,以便能够与观察到的类别对话并导致新事件只会导致另一个类别看到的事件。换句话说,一个高级观察者和一个低级观察者,只有高级观察者才能触发低级事件。正如我所说,我不喜欢它。:)

总而言之,我建议明确 C 和 A 之间的关系,并使用 Observer 保留 C 和 B。

最新更新