一、概念
观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新(The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.)。
二、观察者模式的组成
Subject(被观察的对象接口)
- 规定ConcreteSubject的统一接口;
- 每个Subject可以有多个Observer;
ConcreteSubject(具体被观察对象)
- 维护对所有具体观察者的引用的列表;
- 状态发生变化时会发送通知给所有注册的观察者。
Observer(观察者接口)
- 规定ConcreteObserver的统一接口;
- 定义了一个update()方法,在被观察对象状态改变时会被调用。
ConcreteObserver(具体观察者)
- 维护一个对ConcreteSubject的引用;
- 特定状态与ConcreteSubject同步;
- 实现Observer接口,通过update()方法接收ConcreteSubject的通知。
三、应用场景
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
四、优缺点
优点:
- Subject和Observer之间是松偶合的,分别可以各自独立改变。
- Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
- 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺陷:
- 松偶合导致代码关系不明显,有时可能难以理解。
- 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)
参考资料: