01 概述
- 观察者模式是用于建立一种对象与对象之间的依赖关系,定义对象间一种
一对多
的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
1)抽象主题(Subject):
它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者
对象。
2)具体主题(Concrete Subject):
将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
3)抽象观察者(Observer):
为所有的具体观察者定义一个接口,在得到主题通知时更新自己
。
4)具体观察者(Concrete Observer):
实现抽象观察者角色所要求的更新接口
,以便使本身的状态与主题状态协调。 - 在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者。
- 一个观察目标可以对应多个观察者。
- 例如在游戏中,一群小兵来攻击一个英雄,当英雄死掉的时候,就会通知小兵(告诉它们“我”没了),小兵的状态就改变了,不再攻击这个英雄了。
- 还比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。
02 使用场景
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的。
- 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
03 优缺点
观察者模式的主要的作用就是将对象解耦,将观察者和被观察者完全隔离。
- 观察者模式的优点
观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。 - 观察者模式的缺点
在应用观察者模式时需要考虑一下开发小路问题,程序中包括一个被观察者和多个被观察者,开发和调试比较复杂。