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

时间:2012-06-15 05:25:16

标签: design-patterns

我有一个班级C,其中附有观察员AB。观察者B修改它收到的对象的状态,然后必须将其通知回A。直到现在我只是从观察者C再次调用类B notifyObservers(),但这有一些问题:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

我猜你在这里有一个循环依赖。当观察者需要反映被观察者的当前状态时,观察者模式的效果非常好,但它们没有直接关系。听起来像在这种特殊情况下,A与C有直接的关系,因为A知道C有足够的C来改变它的状态,但是你依靠Observer模式将信息从C传播到A可以直接进行。事实上,你现在有不同的“种类”事件 - A类生成和“其他” - 也表明C和A之间的关系不是你在C和B之间的观察者/观察到的关系。是否有关系C和A也一对一?那将是你在这里简单地应用错误模式的更多证据。另一方面,如果一个B可以为多个C服务,反之亦然,则证明B和C是观察者/观察者。

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

总之,我建议明确表示C和A之间的关系,并使用Observer保留C和B.

答案 1 :(得分:1)

也许Mediator pattern正是您要找的。

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

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