六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

java语言对观察者模式的支持

[复制链接]

升级  18.67%

20

主题

20

主题

20

主题

秀才

Rank: 2

积分
78
 楼主| 发表于 2013-1-27 04:44:47 | 显示全部楼层 |阅读模式
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.");    }} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表