观察者模式是指一个对象Subject状态改变通知到所有观察者Observer。

被观察者内部维护观察者列表,对外暴露添加,移除观察者,和通知方法,通知方法遍历观察者列表调观察者update方法通知,update可定义为传入Subject自身和指定参数。

常用于分布式的处理系统,如消息通知等。

Java工具包也有现成的观察者接口java.util.Observable,可直接继承,但是update传参不支持泛型而且需要维护一个changed变量

示例代码来自:https://github.com/iluwatar/java-design-patterns/tree/master/observer

  • 被观察者对象,继承即可,可以加入一些判断验证
/**
 * Generic observer inspired by Java Generics and Collection by {@literal Naftalin & Wadler}
 *
 * @param <S> Subject
 * @param <O> Observer
 * @param <A> Argument type
 */
public abstract class Observable<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {

  protected List<O> observers;

  public Observable() {
    this.observers = new CopyOnWriteArrayList<>();
  }

  public void addObserver(O observer) {
    this.observers.add(observer);
  }

  public void removeObserver(O observer) {
    this.observers.remove(observer);
  }

  /**
   * Notify observers
   */
  @SuppressWarnings("unchecked")
  public void notifyObservers(A argument) {
    for (O observer : observers) {
      observer.update((S) this, argument);
    }
  }
}
  • 观察者
/**
 * Observer
 * @param <S> Observable
 * @param <O> Observer
 * @param <A> Action
 */
public interface Observer<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {

  void update(S subject, A argument);
}