hanlingbo2008 发表于 2013-1-27 04:44:47

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]
查看完整版本: java语言对观察者模式的支持