一.简介
观察者模式的实现就是有两个角色,一个是观察者( 比如有观察者 a, b , c ),一个是被观察者(比如有被观察者 d ),他们之间存在这样的一种关系,被观察者一旦某些状态改变,就会通知观察者甚至引起被观察者的一些行为的产生。比如 前面说的 a , b , c 他们观察这 d 的 大小写变化,一旦 d 变成了 D ,就会通知 被观察者 a, b, c , 而被观察者就可以因此得知 d 的改变,也可以因此产生一些行为比如 自己也变大写。
《Android 源码设计模式》中的定义是:定义对象一种一对多的依赖关系,使得每当一个对象改变状态,则所有的依赖于它的对象会得到通知并自动更新,通常为一种发布 –订阅的系统。
二.使用场景
- 1.关联行为场景,这种行为是可以拆分的,比如上文的大小写的行为。
- 2.事件多级触发,比如 a ,b , c, 按顺序触发变成大写的操作。
- 3.跨系统的消息交换场景,消息队列,事件总线 EventBus 等,比如 Android 中的广播机制。
三.在 Java 中的实现例子
- Observer ,观察者,在 Java 9 后废弃
- Observable ,被观察者 ,在Java 9 后废弃
虽然上面两个 接口已经废弃但是这并不影响体会 观察者模式的应用,因为这并不是观察者模式的一种唯一写法。实际上,作为一种设计模式,精华的其设计思想而不是实现细节。
1 | //码农是观察者,观察一些 IT 信息 |
执行结果
1 |
|
四.Android 中的体现
观察模式在 Android 中是一种常见的设计模式。
- ListView/RecycklerView 中 的 Adapter, 对于 notifyDataSetChanged 这个方法每次调用都会通知各个item 刷新数据。就是一个观察者模式,其中数据是一个被观察者,每个 item 就是一个观察者。
- 广播的发布和广播接收者的接收 也是一个观察者模式的体现,或者说成一种订阅-发布更加合适,每一个订阅者订阅自己想要的广播,每一个广播都是一个发布者,且通过系统进行中转/转发,从而实现了观察者这种模式,因为这种信息的传递时跨进程的,因此称这种方式为
跨系统的消息交换场景。详见Android 广播的流程 - 观察者一些重要的实践在于一些开源的框架,EventBus ,Otto 等,简化了组件之间的交互,从而降低了耦合。