Observer(观察者)–对象行为型模式
一、意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有的依赖于它的对象都得到通知并被自动更新。
二、动机
1.在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。
2.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
三、适用性
1.当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使他们可以各自独立地改变和复用。
2.当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
3.当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。
四、结构
五、效果
1.目标和观察者间的抽象耦合。
2.支持广播通信。
3.意外的更新。
六、实现
1.创建目标到其他观察者之间的映射。
2.观察多个目标。
3.谁触发更新。
4.对已删除目标的悬挂引用。
5.在发出通知前确保目标的状态自身是一致的。
6.避免特定于观察者的更新协议——推、拉模型
7.显式地指定感兴趣的改变。
8.封装复杂的更新语义。
9.结合目标类和观察者类。
七、要点总结
1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。
3.观察者自己决定是否需要订阅通知,目标对象对此一无所知。
4.Observer模式是基于事件的UI框架中非常常用的设计模式,也是 MVC模式的一个重要组成部分。
八、相关模式
Mediator:通过封装复杂的更新语义,ChangManager充当目标和观察者之间的中介者。
Singleton:ChangeManager可使用Singleton模式来保证它是唯一的并且可全局访问的。
九、举例说明
把你们家电总闸关了,所有的电器都不工作了(有带备用电池的除外),他们都是一个个观察者。
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解