观察者模式

来源:互联网 发布:唱歌测音软件 编辑:程序博客网 时间:2024/05/16 18:22

常用在GUI系统和订阅——发布系统,最重要的作用就是解耦,即将观察者和被观察者解耦

定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新

适用场景:

关联行为场景,需要注意的是,关联行为是可以拆分的,不是“组合”关系;

事件多级出发场景;

跨系统的消息交换场景,如消息队列、事件总线的处理机制。

 

4个角色:抽象被观察者(Observable)、具体被观察者、抽象观察者(Observer)、具体观察者

抽象被观察者:把所有观察者的引用保存在一个集合里,并可提供一个可以增加和删除观察者对象的接口

具体被观察者:将有关状态存入具体观察者对象,当具体被观察者的内部发生改变时,向注册过的观察者发出通知,如果需要实现自动更新,可以根据抽象观察者定义的接口,在自己内部定义一个一样的接口,然后调用里面的方法,实现回调

抽象观察者:定义了一个更新接口

具体观察者:实现抽象观察者所定义的更新接口,如果在获得通知时需要自动更新,需要实现定义在被观察者里的接口

 

JDK里自带的观察者模式:

观察者继承自Observer类,并对要被被观察者回调的方法传入参数Observable,并设置需要的参数,以标志该方法在收到通知时被回调;

被观察者继承自Observable类,并对于需要实现通知和自动更新的方法,在内部设置状态改变的标志setChanged(),然后用notifyObservers(观察者中设置的参数)通知观察者,可以调用回调接口里方法自动更新观察者;

两者之间的底层连接依靠观察者中需要传入的Observable,具体的连接方式是使用Observable对象的addObserver(观察者对象)来实现订阅

 

Android中使用观察者模式比较典型就是ListView或者RecyclerView中的adapter,当数据改变时,被观察者adapter会调用notifyDataSetChanged方法通知UI改变;

另外一个典型例子是广播机制,观察者通过定义IntentFilter、创建广播接受器和实现onReceive方法后,用Context的registerReceiver方法订阅具体的广播消息,当被观察者发生改变时,就可以创建指定IntentFilter的Intent,然后用sendBroadcast(intent)发生广播通知观察者,并触发观察者onReceive里的行为