一、jdk观察者模式实现代码分析:
1、Observable-被观察者(主题)
package java.util;
public class Observable {
private boolean changed = false;
private Vector 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) {
//如果未调用setChanged,将不会通知所有观察者更新
if (!changed)
return;
//若调用了setChanged,则通知所有观察者更新
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();
}
}
2、Observer-观察者接口
package java.util;
public interface Observer {
//观察者更新方法
void update(Observable o, Object arg);
}
二、应用jdk观察者模式实现的案例:
1、被观察者(主题)
import java.util.Observable;
public class ConcreteObservable extends Observable {
public void dataChanged(String msg) {
setChanged();
notifyObservers(msg);
}
}
2、两个观察者
import java.util.Observable;
import java.util.Observer;
public class ObserverA implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("ObserverA"+arg);
}
}
import java.util.Observable;
import java.util.Observer;
public class ObserverB implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("ObserverB"+arg);
}
}
3、测试类
public class ObserverDemo {
public static void main(String[] args) {
// 添加第一个观察者
ObserverA observerA = new ObserverA();
ConcreteObservable observable = new ConcreteObservable();
observable.addObserver(observerA);
observable.dataChanged("第一次发生变化");
System.out.println("观察者数量" + observable.countObservers());
// 添加第二个观察者
ObserverB observerB = new ObserverB();
observable.addObserver(observerB);
observable.dataChanged("第二次发生变化");
System.out.println("观察者数量" + observable.countObservers());
}
}
4、执行结果如下:
ObserverA第一次发生变化
观察者数量1
ObserverB第二次发生变化
ObserverA第二次发生变化
观察者数量2