原标题:Java中的Observer原理的说明
上述我们通过案例,来模拟了按钮的监听事件原理,现在我们通过源码来详细的分析它的运行过程:
一、Observer是一个观察者可以实现的接口,它的文档说明如下:
A class can implement the Observer interface when it wants to be informed of changes in observable objects.
Observer中有一个update()方法:
void update(Observable o, Object arg); // Observable 是观察者arg是notifyObservers方法传入的参数
二、Observable是一个被观察者继承的类,它的文档说明大致如下:
This class represents an observable object, or "data" in the model-view paradigm. It can be subclassed to represent an object that the application wants to have observed.
Observable有几个重要的方法,我们简单的介绍一下:
void addObserver(Observer o) // 加入观察者到Vetor中
protected void clearChanged() // 设置change为false
int countObservers() // 返回Vetor中观察者的数量
void deleteObserver(Observer o) // 从Vetor中删除指定的观察者
void deleteObservers() // 删除所有的观察者
void notifyObservers() // 通知Vetor中的观察者
void notifyObservers(Object arg) // 通知Vetor中的观察者,带参数
boolean hasChanged() // 判断是否发生改变
protected void setChanged() // 设置changed为true
三、接下来,我们结合上述的例子来分析Observer的原理:
当执行MyButton button = new MyButton(),由于MyButton是继承Observable,所以下述代码会执行。
private boolean changed = false;
private Vector obs;
public Observable() {
obs = new Vector();
}
当执行button.addObserver(new ClickObserver()),把参数中的Observer存放在上述初始化的Vetor中(为了适应多线程,用的是Vetor)
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
当执行button.process("huhx"),如果被观察者发生了改变,就通知Vetor中的观察者去执行update方法。
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);
}
责任编辑: