模式介绍

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并自动更新。

使用场景

  • 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时
  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面时
  • 当需要建立一种一对多的依赖关系时

代码示例

// 观察者接口
public interface Observer {
    void update(String message);
}

// 主题接口
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题
public class ConcreteSubject implements Subject {
    private List observers = new ArrayList<>();
    private String state;

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

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

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

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

// 具体观察者
public class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received: " + message);
    }
}

优缺点

优点

  • 实现了表示层和数据逻辑层的分离
  • 支持广播通信
  • 符合开闭原则

缺点

  • 观察者过多时会影响性能
  • 观察者可能不知道彼此的存在
  • 可能导致循环依赖