Observer Pattern

观察者模式: 定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并自动更新1.

我的理解是, 每一个类都可以派一个哨兵, 也就是观察者去目标类进行卧底, 一旦目标状态发生变化或者有任何动作, 哨兵负责把状态返回. 就像小时候每个班都有一个坐在后门看放哨的同学. 目标类可以继承多个观察类, 对于同一个目标的状态改变, 不同的观察类可以返回不同的状态, 从而达到对于同一个目标产生多个不同的响应. 目标不需要通知哨兵, 它的状态发生变化了, 而每个哨兵之间的关系也是相对独立的, 从而达到了减少耦合的效果.

这种设计模式适用于, 一个对象的改变会影响到其他对象, 但是不知道具体有那些对象或者有多少对象会受到影响. 所以这些对象之间的关系不能够是相互依赖的.

  • 目标类需要做的事情就是: 1. 继承观察类. 2. 增加/删除将会受到影响的对象. (增加删除对象的时候不影响其他观察者)
  • 观察类需要做的事情就是: - 提供一个通知更新的接口.

这样就可以实现, 重复使用目标类和观察类, 而不影响其他对象.

最早的可能也是最著名的 Observer 模式的例子出现在 SmallTalk 的 MVC 结构中,它是 SmallTalk 环境[KP88] 中的用户界面框架. MVC 的 Model 类担任目标的角色, 而 View 类是观察者的 base class. SmallTalk, ET++[WGM88], 和 THINK 类库[sym93b]都将 Subject 和 Observer 的接口放入系统所有其他类的父类中, 从而提供一个通用的依赖机制. 其他使用这一模式的用户界面工具有 InterViews[LVC89], AndrewToolkit[p+88] 和 Unidraw[VL90]. InterViews 显示地定义了 Observer(观察类) 和 Observable (目标类). Andrew 分别称它们为”视图”和”数据对象”. Unidraw 将图形编辑器对象分割成 View 和 Subject 两部分2.

安卓界面中大量的使用了 Observer, 通过继承 activity 和 Fragment 的观察类, 主程序状态会被在不同的组件进行更新.