Design Pattern - Observer Pattern

观察者模式

为了后续继续聊 Java IO-Netty,先谈下观察者模式(Observer Pattern)

定义与工作原理

定义:观察者模式是一种对象行为模式,其中一个对象(称为“主题”)维护一组依赖于其的对象(称为“观察者”),并在其状态发生改变时自动通知它们。

工作原理:主题提供一个注册和注销观察者的机制,当主题的状态发生变化时,它会通知所有注册的观察者。

实现方式

  • 松耦合设计:确保主题和观察者之间的耦合度低,易于扩展。
  • 动态注册与注销:允许观察者动态地注册和注销,以适应变化。

类图

示例代码

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. interface Observer {
  4.    void update(String message);
  5. }
  6. interface Subject {
  7.    void registerObserver(Observer o);
  8.    void removeObserver(Observer o);
  9.    void notifyObservers(String message);
  10. }
  11. class ConcreteSubject implements Subject {
  12.    private List<Observer> observers = new ArrayList<>();
  13.    private String state;
  14.    @Override
  15.    public void registerObserver(Observer o) {
  16.        if (!observers.contains(o)) {
  17.            observers.add(o);
  18.       }
  19.   }
  20.    @Override
  21.    public void removeObserver(Observer o) {
  22.        observers.remove(o);
  23.   }
  24.    @Override
  25.    public void notifyObservers(String message) {
  26.        for (Observer observer : new ArrayList<>(observers)) {
  27.            observer.update(message);
  28.       }
  29.   }
  30.    public void setState(String state) {
  31.        this.state = state;
  32.        notifyObservers("State changed to: " + state);
  33.   }
  34. }
  35. class ConcreteObserver implements Observer {
  36.    private String name;
  37.    public ConcreteObserver(String name) {
  38.        this.name = name;
  39.   }
  40.    @Override
  41.    public void update(String message) {
  42.        System.out.println(name + " received update: " + message);
  43.   }
  44. }
  45. public class ObserverDemo {
  46.    public static void main(String[] args) {
  47.        ConcreteSubject subject = new ConcreteSubject();
  48.        ConcreteObserver observer1 = new ConcreteObserver("Observer1");
  49.        ConcreteObserver observer2 = new ConcreteObserver("Observer2");
  50.        // 注册观察者
  51.        subject.registerObserver(observer1);
  52.        subject.registerObserver(observer2);
  53.        // 状态更新,触发通知
  54.        subject.setState("Active");
  55.        // 模拟状态变化
  56.        try {
  57.            Thread.sleep(2000);
  58.       } catch (InterruptedException e) {
  59.            Thread.currentThread().interrupt();
  60.       }
  61.        subject.setState("Inactive");
  62.   }
  63. }

总结

  1. 初始化工作确定被观察者的信息,注册观察者(observer)的信息注册到被观察者(subject)信息里面
  2. 当被观察者信息修改时,则通知所有的观察者