一.观察者模式介绍
观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统,订阅-发布系统。因为这个模式的一个重要作用就是解耦,将被观察和观察者解耦,使他们之间的依赖性更小,甚至做到毫无依赖。
二.观察者模式的定义
定义对象间的一种一(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。
三.观察者模式使用场景
1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
四.观察者模式中的角色
1. Subject(被观察者)
★ 抽象主题,被观察(Observable)的角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
2. ConcreteSubject(具体被观察者)
★ 具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有注册过的观察者发出通知。
3. Observer(观察者)
★ 抽象观察者,该角色是观察者的抽象类,定义了一个更新接口,使得在得到主题的更改通知时更新自己。
4. ConcreteObserver(具体观察者)
★ 具体观察者,该角色实现抽象观察者所定义的更新接口,以便在主题状态发生变化时更新自身状态。
五.Android源码中的实例
1. 点型运用是大家熟悉的BaseAdapter,BaseAdapter关联了一个DataSetObservable对象,并实现registerDataSetObserver和unregisterDataSetObserver两个方法实现注册和撤销Observer,方法notifyDataSetChanged遍历所有观察者,并且调用他们的onChange()方法,告知观察者发生了变化。使用ListView和BaseAdapter组合时,当BaseAdapter的item改变时,我们经常会调用notifyDataSetChanged(),通知Listview刷新。
2. BroadcastReceiver是Android的四大组件之一,它作为应用内,进程间的一种通信方式,能够将某个消息通过广播的形式传递给它注册的对应广播接收器的对象,接收对象需要通过Context的registerReceiver函数注册到AMS中,当通过sendBroadcast发送广播时,所有注册了对应的IntentFilter的BroadcastReceiver对象就会接收到这个消息,BroadcastReceiver中的onReceiver方法就会被调用,这就是典型的发布-订阅模式,也就是观察者模式。
六.总结
观察者模式主要作用就是对象的解耦,将观察者与被观察者完全隔离,只依赖于Observer和Observable抽象,使得它的扩展性,灵活性强,耦合度特别低,代码更加简洁,提升代码质量。
优点:
● 观察者和被观察者之间是抽象耦合,应对业务变化
● 增强系统灵活性,可扩展性
缺点:
● 在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者和多个观察者,开发调试等内容会比较复杂,而且在Java中消息的通知默认是顺序执行的,一个观察者卡顿,会影响整体的执行效率,在这种情况下一般考虑采用异步的方式。
七.基于观察者模式的开源库
● greenrobot 的 EventBus 源码地址:https://github.com/greenrobot/EventBus
● square 的 otto 源码地址:https://github.com/square/otto