观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。
减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作(Collaboration)。观察者模式使满足这一要求的各种设计方案中最重要的一种。
结构:
-
抽象主题(Subject)角色:
- 一个目标可以被多个观察者观察
- 目标提供对观察者注册和退订的维护
- 当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者
-
抽象观察者(Observer)角色:
- 为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口
- 抽象观察者角色一般用一个接口实现。在这个示意性的实现中只包含一个方法(即 Update() 方法),这个方法叫做更新方法
-
具体主题(ConcreteSubject)角色:
将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。具体主题角色通常用一个具体子类实现。
-
具体观察者(ConcreteObserver)角色:
具体观察者角色实现抽象观察者角色所要求的更新接口,一以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
观察者模式特点:
- 目标和观察着之间的关系
- 典型的一对多关系
- 单向依赖
- 观察者依赖于目标
- 触发通知的时机
- 完成了状态维护后触发
- 相互观察
- A、B观察C,B、C观察A(两套观察模式)
- 注意死循环
- 通知的顺序
- 绝对不要依赖于通知的顺序,多个观察者之间的功能使平行的,相互不应该有先后的依赖关系
优点:
- 观察者模式实现了观察者和目标之间的抽象耦合
- 观察者模式实现了动态联动
- 观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知
缺点:
- 可能会引起无谓的操作
- 由于采用广播模式,不管观察者需不需要,每个观察者都会被调用update方法
模式本质:触发联动