观察者模式又叫发布订阅模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节,观察者模式提供一种对象设计,让主题和观察者之间松耦合
1> 关于观察者的一切,主题只知道观察者实现了某一接口,不需要知道观察者的具体类是谁
2> 任何时候都可以增加新的观察者,因为主题唯一依赖的东西是一个实现 Observer 接口的对象列表
3> 有新类型的观察者出现时,主题的代码不需要修改,只要在新类里实现观察者接口,然后注册为观察者即可
4> 可以独立复用主题或观察者因为二者并非紧耦合
5> 改变主题或观察者任何一方,并不会影响另一方,只要他们之间的接口人被遵守
组成部分
1> 抽象目标角色:目标角色知道它的观察者,可以有任意多个观察者观察同一个目标,并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现
2> 抽象观察者角色:为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现
3> 具体目标角色:将有关状态存入各个具体观察者角色对象。当它的状态发生改变时,向它的各个观察者发出通知
4> 具体观察者角色:存储有关状态,这些状态应与目标的状态保持一致。实现观察者角色的更新接口以使自身状态与目标的状态保持一致,在这个角色内也可以维护一个指向具体目标角色对象的引用
观察者模式的类图
观察者模式原理
主题对象并不知道引用具体观察者对象类型,而只知道抽象观察者类型,这样具体主题对象可以动态地维护一系列的观察者对象的引用,并在需要的时候调用每一个观察者共有的更新方法
观察者模式的典型应用
1> 侦听事件驱动程序设计中的外部事件
2> 侦听/监视某个对象的状态变化
3> 发布者/订阅者模型中,当一个外部事件被触发时,通知邮件列表中的订阅者
观察者模式的优点
对象之间可以进行同步通信,可以同时通知一到多个关联对象,对象之间的关系以松耦合的形式组合,互不依赖
使用情况
1> 当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用
2> 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
3> 当一个对象必须通知其它对象,而它又不能假定其他对象是谁
观察者模式在关于目标角色、观察者角色通信的具体视线中的两个版本
1> 拉模式:目标角色在发生变化后,仅告诉观察者存在变化,具体变化细节,则就要自己从目标角色的接口中得到
2> 推模式:发生变化的同时,通过一个参数将变化的细节传递到观察者角色中去