什么是观察者模式
观察者模式,也叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象可以同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使观察者能够自动的更新自己。
观察者模式的层次结构
抽象角色可以是接口,也可以是抽象类,我们按接口的方式来举例
- 抽象通知者:基本结构为通知观察者、添加观察者和删除观察者,比如add(),delete(),notify()这些方法,如下图的Informer
- 具体通知者:根据具体环境需求并实现抽象通知者所要求的接口的角色,如下图的ConcreteInformer
- 抽象观察者:基本结构为收到通知后的行为,比如update(),如下图的Observer接口
- 具体观察者:根据具体环境需求实现抽象观察者的角色,如下图的ConcreteObserver

观察者模式的优缺点
优点
- 观察者模式最好的效果是接触耦合,耦合的双方都依赖于抽象而不是具体,所以各自具体角色的变化都不会造成另一边的变化。
缺点
- 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
实例
抽象通知者:

具体通知者:

抽象观察者:

具体观察者:

客户端:

从实例中,我们来看观察者模式的优缺点:
- 优点:我们在客户端中,比如可以只需修改通知者的具体类,而不用修改其他逻辑,就可以进行替换,并不会影响其他的部分
- 缺点:观察者只是收到了通知者的通知,具体通知者发生了什么变化,观察者无从知道,比如添加了新的观察者,而原有的观察者并不知道
如果有什么疑问或者是不足,欢迎大家讨论和指出,谢谢。
参考资料
- 《大话设计模式》
- 《观察者模式的优缺点以及使用场景(三)》