观察者模式
其实也就是订阅与被订阅的一种关系,编程中很多设计模式的工作思想,是对现实生活方式的一种映射,观察者模式类似生活中的订阅报纸的过程,我(订阅者)在报社登记了报纸,那么报社(事件源)每天都会定期给我发送报纸
Java中已经帮我们现实了相关接口,免去了每次需要自己实现的过程
Observable(有点也叫Subject)-可观察者(即事件源)
Observer-观察者(即订阅者)
Observer订阅Observable,一旦Observable数据发生变更,立刻通知所有订阅了的Observer
一个简单的例子:
public class A {
public static void main(String[] args) {
MyObservable observable = new MyObservable();
MyObserver my1 = new MyObserver();
MyObserver my2 = new MyObserver();
observable.addObserver(my1);
observable.addObserver(my2);
observable.t();
}
static class MyObservable extends Observable {
void t() {
setChanged();
notifyObservers("更新..");
}
}
static class MyObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg.toString());
}
}
}
MyObservable(事件源)将需要订阅的对象add保存,若数据发生改变,调用notifyObservers刷新数据,setChanged()的作用只是为了增加代码弹性,“过滤或者说是拦截”是否发送数据源信息。
看一下实现的源码,其实内容很少,Observable含有一个Vector集合对象,add过程其实是将Observer对象添加到了Vector对象中,Vector是线程安全的。
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
刷新数据并通知订阅者,其实是变量Vector对象,然后分发数据的过程
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}