2

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

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

我最初的想法是B通知自己的观察者,其中A也注册为观察者B

有一个更好的方法吗?我应该使用不同的模式来实现这一点吗?

4

2 回答 2

1

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

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

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

综上所述,我建议明确 C 和 A 之间的关系,并使用 Observer 保留 C 和 B。

于 2012-06-15T05:45:12.353 回答
1

也许中介者模式就是您正在寻找的。

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

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

于 2012-06-15T06:03:26.600 回答