栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Observable类总结 观察者模式中的被观察者 发布订阅模式中的发布者

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Observable类总结 观察者模式中的被观察者 发布订阅模式中的发布者

文章目录
  • Observable类重点
  • Observable类方法
  • Observable类实现
    • Observable类属性
    • Observable类操作
      • addObserver方法
      • deleteObserver方法
      • deleteObservers方法
      • notifyObservers方法
        • notifyObservers(Object arg)方法
        • clearChanged方法

Observable类重点
  1. Observable类是被观察者,也是发布者,其观察者是Observer,Observer是一个函数式接口,可以看我这篇文章 Observer
  2. Observable类内部的方法是线程安全的
Observable类方法
方法名作用
public synchronized void addObserver(Observer o)将观察者添加到观察者集合,不能添加相同的观察者
public synchronized void deleteObserver(Observer o)从观察者集合中删除观察者
public synchronized void deleteObservers()清空观察者集合
public void notifyObservers()通知观察者集合中所有观察者,传递给观察者一个null参数
public void notifyObservers(Object arg)通知观察者集合中所有观察者,传递给观察者一个arg参数
protected synchronized void setChanged()将被观察者标记为已更改,只有标记后才能调用上面两个通知方法
protected synchronized void clearChanged()将被观察者标记为未更改,即清除已更改标记
public synchronized boolean hasChanged()测试被观察者是否已更改
public synchronized int countObservers()统计观察者的数量

注:Observable类方法全部都是synchronized方法,连notifyObservers里面都使用了synchronized代码块,所以是线程安全的

Observable类实现 Observable类属性
  1. changed是被观察者Observable改变了,才设为true,当通知了观察者Observer后会重新设为false,防止重复通知,要想通知之前必须把changed设为true
  2. obs是Vector类对象,Vector类似ArrayList,只不过Vector里面的方法大多用synchronized修饰,所以是线程安全的,这里的Vector存放的是观察者对象,也就是订阅者对象,Observer是一个函数式接口,里面只有一个方法update方法,而被观察者通知观察者的方式就是遍历观察者数组Vector,取出每个观察者调用其update方法
public class Observable {
    private boolean changed = false;
    private Vector obs;
}
Observable类操作 addObserver方法

当Vector数组集合中没有该观察者时,才往里面添加元素

public synchronized void addObserver(Observer o) {
    if (o == null)
        throw new NullPointerException();
    if (!obs.contains(o)) {
        obs.addElement(o);
    }
}
deleteObserver方法

调用Vector数组集合的删除方法,数组的删除是用复制,从目的索引开始之后所有值全部往前面复制,调用System.arraycopy方法

public synchronized void deleteObserver(Observer o) {
    obs.removeElement(o);
}
deleteObservers方法

删除Vector内部所有元素,即把所有元素全部置空类似array[i] = null

public synchronized void deleteObservers() {
    obs.removeAllElements();
}
notifyObservers方法

调用notifyObservers方法,传递给null参数,该null会传递给观察者Observer的update方法

public void notifyObservers() {
    notifyObservers(null);
}
notifyObservers(Object arg)方法
  1. arrLocal是快照数组,先把所有观察者复制到该数组,形成一个快照,在遍历该数组时如果有新注册的观察者,也无法通知它们
  2. changed是改变状态值,只有为true,才能继续执行后续代码,负责直接返回
  3. clearChanged可以让changed值变为false,防止重复通知
  4. for循环是遍历快照数组,取出其中的观察者逐个调用update方法
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);
}
clearChanged方法

将chagned设为false,表示被观察者未更改

protected synchronized void clearChanged() {
  changed = false;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439328.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号