观察者模式的定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会的到通知并被自动更新。
观察者模式的使用场景
(1)关联行为场景,关联行为是可以拆分的而不是“组合”关系
(2)事件多级触发。
(3)跨系统的消息交换场景,如消息队列、事件总线的处理机制。
观察者模式实现方式(举例)
观察者(订阅方)
class Coder implements Observer{
public String name;
public Coder(String name){
this.name = name;
}
@Override
public void update(Observable arg0, Object arg1) {
System.out.println("Hi,"+name+",Web更新啦,内容是---"+arg1);
}
public String toString(){
return "coder:"+name;
}
}
被观察者(发布方)
class Web extends Observable{
public void pushNews(String content){
setChanged();
notifyObservers(content);
}
}
在主函数中调用:
public class ObserverTest {
public static void main(String[] args){
//被观察者
Web mWeb = new Web();
//观察者
Coder coder1 = new Coder("coder1");
Coder coder2 = new Coder("coder2");
Coder coder3 = new Coder("coder3");
//将观察者注册到被观察者对象的观察者列表中
mWeb.addObserver(coder1);
mWeb.addObserver(coder2);
mWeb.addObserver(coder3);
//被观察者发布消息
mWeb.pushNews("被观察者(发布方)发送给观察者(订阅方)的一条新消息");
}
}
运行结果:
Hi,coder3,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
Hi,coder2,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
Hi,coder1,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
Observer和Observable是JDK中的内置类型,也就是说Java对观察者做了支持。根据上面例子我们可以知道,观察者模式中:
Observable抽象的被观察者把所有观察者对象的引用保存在一个集合里,可以添加和删除观察者;具体的被观察者将发生改变时的行为自行控制,给所有添加过的(也可以说是注册过的)观察者发送通知。
Observer抽象的观察者,定义了更新接口,使得在得到被观察者的通知后更新自己;具体的观察者实现了更新接口,自行决定如何更新。
在Android中的观察者模式
Android中的ListView和RecyclerView的Adapter更新数据、广播接收器都用到了观察者模式。
以ListView为例:ListView设置Adapter(调用setAdapter)时,会构建一个AdapterDataSetObserver,并且注册到Adapter中(其实就是将观察者通过调用Adapter内部的被观察者DataSetObservable添加观察者到观察者列表中去),在数据发生变化时,开发者手动调用notifyDataSetChanged方法,内部调用了DataSetObservable的notifyChanged方法,该方法会循环遍历之前添加到观察者列表中的观察者AdapterDataSetObserver,并调用他们的onChanged方法,onChanged方法会获取数据集的新数量,调用requestLayout重新布局,更新用户界面。
网友评论