在阅读关于观察者模式的文章时,我遇到了在观察者模式负债下列出的下面的点
观察者对象是完全独立的,他们不了解观察者的存在。因此,在通知所有观察者之前, Observer对象可以更改主题的状态(在Update方法中)。这可能会导致状态不一致,状态更改通知将丢失。
如果可能的话
答案 0 :(得分:3)
没有任何地方声明观察者本身不能改变其主题,尽管由于上述原因,在大多数情况下不建议使用观察者。但是,从技术上讲,这是可能的,特别是如果通知调用包含主题本身作为参数:
class MyObserver implements Observer<MySubject> {
...
public void notify(MySubject theSubject) {
...
theSubject.changeSomeProperty(newValue);
}
...
}
至于如何防止观察者在通知周期进行时改变主题,我看到了一些选项,但是每一个都引入了额外的复杂性,这些都不是100%保证,有些比它的价值更麻烦
答案 1 :(得分:1)
虽然不推荐,但没有什么能阻止观察者改变观察对象的状态(通常,参见C ++中的const-correctness以反例)。当然,观察到的物体可能会跳过箍以防止/不允许这样做,但这很乏味。
如果在所有其他观察者访问该对象之前状态发生了变化,他们会发现一个与他们期望的状态不同的状态(被通知)。
答案 2 :(得分:1)
如果我们的主题是S
,我们有两名观察员注册; A
和B
,然后:
如果A
的{{1}}包含可修改responseHandler()
的代码,则会在S
收到通知之前更改S
的状态。
处理特定排序或其他特殊条件的代码属于B
的{{1}}方法,您可以将S
标记为不可修改或准备某些特定的通知顺序更新notifyObservers()
。