观察者模式是经常被使用的设计模式之一,前阵子有同事问:观察者模式和回调有何区别?一种很表层的区别是,观察者模式是一种一对多的关系,而回调是一种单对单的关系。应用场合也很灵活。
观察者模式主体就两个类,被观察者、观察者,以及观察者实现的将被通知的接口。Ilistener是被观察者的内部接口。观察者继承于Ilistener这个接口,被观察者中会创建一个保存观察者的集合。基本模型图如下所示:
2、发布订阅者模式
这个模式和观察者模式是一样的,不过是另外一种说法。这种模式也是两个主体,发布者和订阅者。例如Android的事件处理模型就是采用这种模式(在Android事件处理中讲解)。发布者需要发布的内容一般由外部条件触发产生。产生的内容一部分由内部消费,另一部分输出给订阅者使用。基本模型如下所示:
3、Android系统中使用的观察者模式
1)、Android系统中的广播机制使用的就是发布订阅者模式。
下图描述广播机制的基本模型,其中进程1通过sendBroadcast()发送广播,充其量只不过是一个外部输入,最终还是将输入交给系统内部去处理,系统在这个过程中充当的是发布者的角色,然后将广播发送给订阅者进程2,即BroadCastReceiver。观察者会通过registerBroadCastReceiver()注册到系统中,主是注册到到AMS(ActivityManagerService)中?
2)、contentProvider、contentResolver、contentObserver机制.
这里必须说明一点的是:实际上面向观察者的是ContentResolver,当然它只是一个壳。具体的数据操作还由ContentProvider
来完成。对于观察者来说,ContentResolver是最直接的被观察对象。ContentProvider相对于用户来说是隔离的。
使用设计模式可以提高代码的结构质量,便于代码的复用、维护、修改,但一定程度上也会有负面影响。
优点:
1)、观察者不必时时关注被观察对象的变化,可以处理自已的内部事务。
2)、被观察对象会将数据集准备好、事件等先处理好,然后将这个变化告知观察者,其实也是在减轻观察者的负担和工作量。
3)、观察者不必关注被观察对象如何发生变化,只需知道变化的结果就好。
缺点:
1)、观察者后知后觉,对变化的响应是有延后的。