`
xuela_net
  • 浏览: 497501 次
文章分类
社区版块
存档分类
最新评论

设计模式的皇后-观察者模式

 
阅读更多

观察者是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:

1, 观察者(具体执行操作的对象,有多个)
2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)

所有被观察者都要继承的类 Observable.java

public class Observable {
    private boolean changed = false;
    private Vector obs;    //装有所有观察者的集合
   
 

    public Observable() {
	obs = new Vector();
    }

    /**
     * 将观察者加入到观察者集合中
     * @param o
     */
    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);
    }

    /**
     * 与上面的方法比较 带了参数
     * @param arg
     */
    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();
    }
}

所有观察者都要实现的接口 Observer.java

public interface Observer {

    void update(Observable o, Object arg);
}


观察者模式比较常用的场景

  • 条形图可以观察它显示的数据对象,以便在这些对象变化时对它们进行重新绘制。

  • AccountManager 对象能够观察 Account,这样,在帐户状态改变时,它们可以向销售人员发送一封电子邮件。

  • 支付服务能够观察在线音乐商店中的歌曲播放事件,以便向客户收费。

  • 分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics