定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。
使用场景
- 关联行为场景。需注意的是,关联行为是可拆分的,而不是组合关系。
- 事件多级触发场景。(责任链模式?)
- 跨系统的消息交换场景。如消息队列、事件总线的处理机制。
角色
- Subject:抽象主题,也就是 被观察者。
被观察者把所有观察者对象的引用保存到一个集合里,每个被观察者都可以有任意数量的观察者,同时提供一个借口,可以新增和删除观察者。
- ConcreteSubject:具体主题,也就是 具体被观察者。
该角色将观察状态存入具体观察者对象中,在具体被观察者内部状态发生改变时,给所有注册过的观察者发出通知。
- Observer:观察者。
观察者抽象类,该类定义了一个更新接口,在得到被观察者的改变通知时更新自己。
- ConcreteObserver:具体观察者。
该角色实现抽象观察者角色所定义的更新接口,以便在被观察者的状态发生变化时更新自身的状态。
实现方式
此处不给代码示例,具体请参考 Android ListView 中关于 adpter.notifyDatasetChanged() 相关的源码 以及 BroadcastReceiver 相关的源码
注意
观察者模式 非常重要!!在 Android 源码中两个典型用处就是上文所说的两个地方,另外,EventBus 以及 AndroidEventBus 中也使用了 发布-订阅模式(也就是观察者模式),可以直接阅读其源码来学习该模式。
网友评论