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

匿名 (未验证) 提交于 2019-12-02 21:52:03

学习观察者模式,结合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、向所有观察者发送通知

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!