首页 > 编程语言 > 详细

观察者模式 —— java.util.Observable 源码学习

时间:2019-07-25 16:23:15      阅读:61      评论:0      收藏:0      [点我收藏+]

学习观察者模式,结合JavaJDK的内置观察者模式代码一起学习package java.util;


//不是抽象类,也不是接口
public class Observable { private boolean changed = false; //状态标志 private Vector<Observer> 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) {
      /*从集合中提取每个观察者的代码需要同步,但是通知观察者的代码不需要(不应该)。
        潜在的最坏的结果是:
        (1)新增的观察者错过了正在进行的通知
        (2)未注册的观察者被通知到了
     */
            if (!changed) //判断标志
                return;
            arrLocal = obs.toArray(); //集合转化成数组
            clearChanged(); //标志恢复成false 不需要通知更新
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);  //每个观察者的update方法需要的参数是两个,主题和参数
    }

    /**
     * 清除全部的观察者
     */
    public synchronized void deleteObservers() {
        obs.removeAllElements();
    }

    /*将标志改为true ,主题(被观察者)发生改变了*/
    protected synchronized void setChanged() {
        changed = true;
    }

    /*标志更新为false, 主题没有变动,或者是变动了但是已经通知过了*/
    protected synchronized void clearChanged() {
        changed = false;
    }

    /*查看是否发生改变(返回就是标志)*/
    public synchronized boolean hasChanged() {
        return changed;
    }

    /*返回观察者的数量*/
    public synchronized int countObservers() {
        return obs.size();
    }
}

 

这个类的主要构成要点:

1、包含所有观察者的(空)的集合 + 对这个集合的管理操作(增减,查看数量)

2、包含一个(是否变动)标志 + 对这个标志的管理操作(设置、查看)

3、向所有观察者发送通知

 

 

继续学习观察者模式,JavaJDK中java.util.Observer源码学习:

package java.util;

/*这是观察者的接口,关键点就是它有一个update方法,每当被通知修改时候,就是这个方法被调用
 */
public interface Observer {
    void update(Observable o, Object arg);
}

 

使用这两个内置的观察者模式类,参考方法:

(1)新建一个具体主题类继承

 

观察者模式 —— java.util.Observable 源码学习

原文:https://www.cnblogs.com/pikaqiucode/p/11244913.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!