java语言对观察者模式的支持
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).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."); }}
页:
[1]