/**
* @Classname Observer:观察者模式的接口
*/
public interface Observer {
void update(Observable o,Object arg);
// 当目标对象发生变化时,观察者得到通知进行相应的工作
}
/**
* @Classname Observable:抽象目标类,定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例
*/
public class Observable {
private boolean changed = false; // 内部标志位,表明对象状态,为true时才通知观察者
private Vector<Observer> obs;
public Observable() {
this.obs = new Vector<>();
}
public synchronized void addObserver(Observer o) {
if (o == null) {
throw new NullPointerException();
}
if(!obs.contains(o)) {
obs.addElement(o);
}
} // 用于将新的观察者对象添加到向量中
public void notifyObservers() {
notifyObservers(null);
}
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);
} // 调用向量中的所有观察者对象的update()方法,通知它们数据发生改变。通常越晚加入向量的观察者越先得到通知
public synchronized void deleteObserver(Observer observer) {
obs.removeElement(observer);
}
public synchronized void deleteObservers() {
obs.removeAllElements();
}
public synchronized void setChanged() {
changed = true;
}
public synchronized void clearChanged() {
changed = false;
}
}
设计模式之观察者模式
最新推荐文章于 2024-08-13 16:16:10 发布