我有一个班级C
,其中附有观察员A
和B
。观察者B
修改它收到的对象的状态,然后必须将其通知回A
。直到现在我只是从观察者C
再次调用类B
notifyObservers(),但这有一些问题:
B
需要忽略第二次更新,因为它引发了更新我最初的想法是让B
通知自己的观察员,其中A
也被注册为B
的观察者。
有更好的方法吗?我应该使用不同的模式来实现这一目标吗?
答案 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正是您要找的。
在这种模式中,您有一个处理多个(不同)同事对象之间通信的导演。同事直接了解他们的导演,他们只与他们沟通。导演负责管理同事。因此它解耦了同事对象并简化了通信协议。
也许你可以根据自己的需要调整它。