2012-06-15 107 views
2

我有一个类C,其中有观察者,AB附加到它。观察者B修改它收到的对象的状态,然后必须通知A。直到现在我只是再次从观察者B调用类C notifyObservers(),但是这有几个问题:当观察者修改对象状态时使用观察者模式

  • 很难理解
  • B需要忽略第二个更新,因为它提出了更新

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

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

回答

1

也许Mediator pattern是你在找什么。

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

也许你可以适应你的需要。

+0

只是让我理解你的评论。你只是说,当对象被“B”本身以外的任何人修改时,我应该只通知观察者'B',并且确定这个的逻辑将在中介中。 – Gaurav

+0

是的,这可能会工作。您可以在中介中添加两个* observer *通知。你可以有一个方法'register_C_Observers'和一个'register_ObjectChange_Observer'。然后有一些方法'notify_C_Observers'和'notify_ChangeObject_Observers'。我不太确定这是否符合介体模式的*精确*规范。但是你将通信分解成一个类可能会导致更清晰的代码。 – matcauthon

1

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

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

我见过这种情况发生在我自己的代码中,当它看起来像我有递归,因为我的C改变了我的遗嘱,然后导致C发送另一个事件,导致A再次采取同样的行动。我当时找到的解决方案,我不太喜欢,特别是引入不同的“类别”观察员,并为每个类别维护单独的观察员名单和基本不同类型的事件,以便可以对观察到的导致新事件只会导致其他类别看到的事件。换句话说,高级观察员和低级观察员,只有高级观察员才能触发低级别事件。正如我所说,我不喜欢它。 :)

总之,我建议使C和A之间的关系明确,并使用Observer离开C和B.

+0

我简化了案例,有很多观察者喜欢'A'。使用类别意味着我将所有这些观察者移动到该类别并将'B'保留在单独的类别中。这是你的建议吗? – Gaurav