在“观察者模式”中,有两个重要角色:
1、“观察者”
2、“被观察者”
当“被观察者”发生了变化,则“观察者”也应该随着发生变化。
jdk提供了对观察者模式的支持:
1、“观察者”的接口
public interface Observer {
void update(Observable o, Object arg);
}
2、“被观察者”的基类
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() {
notifyObservers(null);
}
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);
}
public synchronized void deleteObservers() {
obs.removeAllElements();
}
protected synchronized void setChanged() {
changed = true;
}
protected synchronized void clearChanged() {
changed = false;
}
public synchronized boolean hasChanged() {
return changed;
}
public synchronized int countObservers() {
return obs.size();
}
}
写一个例子,运动员是被观察者,裁判是观察者
import java.util.Observable;
public class Player extends Observable {
public void dobiz() {
super.setChanged();
notifyObservers();
}
public static void main(String[] args) {
Player player = new Player();
Judge judge1 = new Judge("singo");
Judge judge2 = new Judge("flus");
player.addObserver(judge1);
player.addObserver(judge2);
player.dobiz();
}
}
import java.util.Observable;
import java.util.Observer;
public class Judge implements Observer {
private String name;
public Judge(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(name + " judged.");
}
}