- Observable类重点
- Observable类方法
- Observable类实现
- Observable类属性
- Observable类操作
- addObserver方法
- deleteObserver方法
- deleteObservers方法
- notifyObservers方法
- notifyObservers(Object arg)方法
- clearChanged方法
- Observable类是被观察者,也是发布者,其观察者是Observer,Observer是一个函数式接口,可以看我这篇文章 Observer
- 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类属性- changed是被观察者Observable改变了,才设为true,当通知了观察者Observer后会重新设为false,防止重复通知,要想通知之前必须把changed设为true
- 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)方法
- arrLocal是快照数组,先把所有观察者复制到该数组,形成一个快照,在遍历该数组时如果有新注册的观察者,也无法通知它们
- changed是改变状态值,只有为true,才能继续执行后续代码,负责直接返回
- clearChanged可以让changed值变为false,防止重复通知
- 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;
}



