观察者模式的作用:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
案例
JDK 中对观察者模式的实现
观察者接口,实现该接口用于被通知发生变化,进行更新
public interface Observer {
void update(Observable o, Object arg);
}
Observable 相当于主题角色,可以注册、删除、通知观察者
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) {
if (!changed)
return;
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();
}
}
【Java学习资源】整理推荐
- 中介者模式的实际应用
- 观察者模式在开源代码中的应用
- 职责链模式在开源代码中的应用
- 命令模式在开源代码中的应用
- 策略模式在开源代码中应用
- 模板方法模式在开源代码中应用
- 组合模式在开源代码中的应用
- 享元模式在开源代码中的应用
- 外观模式在开源代码中的应用
- 装饰器模式在开源代码中的应用
- 桥接模式在开源代码中的应用
- 适配器模式在开源代码中的应用
- 代理模式在开源代码中的应用
- 原型模式在开源代码中的应用
- 建造者模式在开源代码中的应用
- 工厂模式在开源代码中的应用
- 单例模式在开源代码中的应用
- 编码规范
- 设计模式
- 重构
- 设计原则
- 面向对象到底是什么
- 代码质量有哪些评判标准?