【发布时间】:2015-02-15 00:03:58
【问题描述】:
在 Android 应用程序的开发过程中,我遇到了这个我目前无法解决的设计难题。我将不胜感激任何想法、解决方法或干净的解决方案:) 我会尽量简化它:
一切都从一个通用的观察者模式实现开始。有一个主题在其公共方法调用时改变状态;并且有观察者对这些变化做出相应的反应。 在这种情况下,主题是一个 STATEFUL 主题,这意味着它有一个内部状态控制器(一个 int),它像自动机一样变化。每次它的状态改变时,它都会像往常一样通知观察者:
- client -> subject.anyMethod() //将主体状态更改为状态 X
- subject -> notifyObservers(newState) // 主题通知新状态 X
- observer -> subject.getData() // 获取数据
但现在想想这种情况:
- client -> subject.anyMethod() //将主体状态更改为状态 X
- subject -> notifyObservers(X) // 主题 FIRST 通知瀑布
- observerA -> subject.anyMethod() //根据状态 Y 改变主题
- subject -> notifyObservers(Y) // 启动第二个通知瀑布
现在会发生什么,作为第二个瀑布的结果,下一个观察者(假设是观察者 B)将收到状态 Y(来自最后一个第二个瀑布)的通知,并采取相应的行动,当这个第二个瀑布完成后,PC(程序计数器)将继续执行第一个通知瀑布,并重新通知观察者 B 旧状态 X。这会产生两个主要问题:第一个问题是,观察者 B 以错误的顺序收到新状态的通知(第一个状态 Y,然后状态 X 当它应该是相反的方式时)第二个也是最重要的,即使以错误的顺序通知,当观察者 B 收到新状态 X 的通知时,它是完全错误的,因为主题真实状态是 Y;这会产生很多问题。
您可能已经意识到,这种情况发生在观察者提交主题状态更改时,当它收到通知而不是仅从主题中获取数据时。我将不胜感激任何其他模式或解决方案。还要澄清一下,只有一个线程。
提前致谢。
【问题讨论】:
标签: java oop design-patterns uml observer-pattern