12.1 java语言对观察者模式的支持
在java语言的java.util库里面,提供一个Observable类以及Observer接口,构成java语言对观察者模式的支持。
例子代码:
import java.util.Observer;
import java.util.Vector;
//java 库中的类,非用户定义的类,可以直接调用
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();
}
}
public interface Observer {
void update(Observable o, Object arg);
}
import java.util.Observable;
public class Watched extends Observable{
private String data = "";
public String retrieveData(){
return data;
}
public void changeData(String data){
if ( !this.data.equals( data) ) {
this.data = data;
setChanged();
}
notifyObservers();
}
}
import java.util.Observable;
import java.util.Observer;
public class Watcher implements Observer{
public Watcher(Watched w){
w.addObserver(this);
}
public void update( Observable ob, Object arg){
System.out.println("Data has been changed to: '" + ((Watched)ob).retrieveData() + "'");
}
}
import java.util.Observer;
public class Tester
{
static private Watched watched;
static private Observer watcher;
public static void main(String[] args) {
watched = new Watched();
watcher = new Watcher(watched);
watched.changeData("In C, we create bugs.");
watched.changeData("In Java, we inherit bugs.");
watched.changeData("In Java, we inherit bugs.");
watched.changeData("In Visual Basic, we visualize bugs.");
}
}