标签:port static end 注册 ring class dem set 添加
一、jdk观察者模式实现代码分析:
1、Observable-被观察者(主题)
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) { //如果未调用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
标签:port static end 注册 ring class dem set 添加
原文地址:https://www.cnblogs.com/silenceshining/p/10480258.html