【问题标题】:Using observer pattern when observers modify object state当观察者修改对象状态时使用观察者模式
【发布时间】:2012-06-15 05:25:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    也许Mediator pattern 是您正在寻找的。

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

    也许你可以根据自己的需要调整它。

    【讨论】:

    • 只是为了让我正确理解您的评论。你是说我应该只在对象被B 本身以外的任何人修改时才通知观察者B,并且确定这一点的逻辑将在中介中。
    • 是的,这可能会奏效。您可以在调解器中添加两个 observer 通知。你可以有一个方法register_C_Observers 和一个register_ObjectChange_Observer。然后是方法notify_C_Observersnotify_ChangeObject_Observers。我不太确定这是否符合中介模式的 exact 规范。但是你将通信分离到一个类中可能会导致更清晰的代码。
    【解决方案2】:

    您可能不应该引入观察者观察观察者(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。

    【讨论】:

    • 我把案例简化了,有很多像A这样的观察者。使用类别意味着我将所有这些观察者移至该类别并将B 保留在一个单独的类别中。这是你的建议吗?
    猜你喜欢
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2022-12-14
    相关资源
    最近更新 更多