设计模式 -- 观察者模式

说明

  1. @author blog.jellyfishmix.com / JellyfishMIX - github
  2. LICENSE GPL-2.0

定义

观察者模式(Observer Design Pattern) 也被称为发布订阅模式(Publish-Subscribe Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

中文翻译: 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

从模型来讲,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如: Subject-Observer, Publisher-Subscriber, Producer-Consumer, EventEmitter-EventListener, Dispatcher-Listener。不管怎么称呼,只要应用场景符合定义,都可以看作观察者模式。

从定义中可以知道,观察者模式主要应用于通知的场景,并且通知的主题可能会频繁的改变。观察者模式可以解耦被观察者与观察者。

观察者接口

定义了观察者感知消息的能力。

public interface Observer {
  void update(Message message);
}

事件

定义了操作观察者的能力。

public interface Subject {
  void registerObserver(Observer observer);
  void removeObserver(Observer observer);
  void notifyObservers(Message message);
}

事件实现

实现了操作观察者的能力。

public class ConcreteSubject implements Subject {
  private List<Observer> observers = new ArrayList<Observer>();

  @Override
  public void registerObserver(Observer observer) {
    observers.add(observer);
  }

  @Override
  public void removeObserver(Observer observer) {
    observers.remove(observer);
  }

  @Override
  public void notifyObservers(Message message) {
    for (Observer observer : observers) {
      observer.update(message);
    }
  }
}

观察者实现

实现了观察者感知消息的逻辑。

public class ConcreteObserverA implements Observer {
  @Override
  public void update(Message message) {
    // do something 获取消息通知后,执行观察者的自定义逻辑
    System.out.println("ConcreteObserverA is notified.");
  }
}

public class ConcreteObserverB implements Observer {
  @Override
  public void update(Message message) {
    // do something 获取消息通知后,执行观察者的自定义逻辑
    System.out.println("ConcreteObserverOne is notified.");
  }
}

demo

  1. 示例化一个主题,向主题注册多个观察者,触发主题通知观察者。
public class Demo {
  public static void main(String[] args) {
    ConcreteSubject subject = new ConcreteSubject();
    subject.registerObserver(new ConcreteObserverA());
    subject.registerObserver(new ConcreteObserverB());
    subject.notifyObservers(new Message());
  }
}

你可能感兴趣的:(设计模式,Java,设计模式,观察者模式)