当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式
一、概述
有时被称作发布/订阅模式,观察者模式定义了对象之间的一对多的依赖关系,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。
二、解决的问题
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
三、模式中的角色
- 1、抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
- 2、具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
- 3、抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 4、具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
四、模式解读
模板方式模式的类图如下所示
五、JDK涉及到的设计模式
JDK中体现java.util.Observer和Observable
六、模式总结
优点
- 1、观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
缺点
- 1、依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。
- 2、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
- 3、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
- 4、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
适用场景
- 1、当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。
- 2、 一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。