常用在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里的行为