观察者模式(别名Publish-Subscribe):定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
生活中的实例:
订阅报纸杂志
要点:
1. 主题用一个共同的接口来通知观察者(notifyObservers) 2. 主题和观察者之间松耦合,主题不知道观察者的细节,只知道观察者实现了观察者接口(update) 3. 推、拉模式各有千秋,推的实现要简单一些
实现:
Subject:
public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
Observer:
public interface Observer { public void update(); }
Concrete Subject:
public class ConcreteSubject implements Subject { private ArrayList<Observer> observers; public ConcreteSubject() { observers = new ArrayList<Observer>(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { observer = observers.get(i); observer.update(); } } public void stateChanged() { notifyObservers(); } public void setState() { stateChanged(); } }
Concrete Observer:
public class ConcreteObserver implements Observer { private Subject subject; public ConcreteObserver(Subject subject) { this.subject = subject; subject.registerObserver(this); } public void update() { // your code } }
Java对观察者模式的实现:
适用性:
优点:
缺点: