对观察者模式稍作整理:
GoF:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:
1, 观察者(具体执行操作的对象,有多个)
2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)
被观察者:
package java.util;
public class Observable {
private boolean changed = false;
private Vector obs;
//创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。
public Observable() {
obs = new Vector();
}
/**
* 添加观察者到观察者列表中去
*/
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
/**
* 删除一个观察者
*/
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
/**
* 与上面的那个通知方法不同的是,这个方法接受一个参数,这个参数一直传到观察者里,以供观察者使用
*/
public void notifyObservers(Object arg) {
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);
}
}
观察者:
package java.util;
public interface Observer{
void update(Observable o, Object arg);
}
观察者的实现,读者:
import java.util.Observable;
import java.util.Observer;
public class Reader implements Observer{
public void update(Observable o, Object arg) {
System.out.println("读者收到消息,并执行更新操作!");
}
}
主题:继承了被观察者,所以通知程序已经写好
import java.util.Observable;
import java.util.Observer;
public class Subject extends Observable {
public void perform(){
//业务处理
//标志为改变后通知所有观察者
super.setChanged();
super.notifyObservers(null);
}
public static void main(String[] args) {
//新增一个观察者
Observer reader = new Reader();
//创建被观察者,并将观察者加入到自身的列表中
Subject subject = new Subject();
subject.addObserver(reader);
//执行自身的业务
subject.perform();
}
}