觀察者模式是一種行為型設計模式,定義對象間「一對多」依賴關係:當主題對象狀態發生變化,所有註冊的觀察者對象自動收到通知並做出響應。就像訂閱報紙:報社(主題)出版新報,所有訂戶(觀察者)自動收到。
update(event),收到通知時執行具體邏輯。notifyObservers()。update() 處理具體業務響應。// 觀察者接口
public interface Observer {
void update(Object event);
}
// 主題接口
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(Object event);
}
public class ConcreteSubject implements Subject {
private final List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer observer) {
if (observer != null && !observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Object event) {
for (Observer obs : observers) {
obs.update(event);
}
}
}
public class ConcreteObserver implements Observer {
private final String name;
public ConcreteObserver(String name) { this.name = name; }
@Override
public void update(Object event) {
System.out.println(name + " 收到通知: " + event);
}
}
public class Main {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer obs1 = new ConcreteObserver("觀察者A");
Observer obs2 = new ConcreteObserver("觀察者B");
Observer obs3 = new ConcreteObserver("觀察者C");
subject.attach(obs1);
subject.attach(obs2);
subject.attach(obs3);
System.out.println("=== 第一次通知 ===");
subject.notifyObservers("事件: 系統啟動完成");
subject.detach(obs2);
System.out.println("=== 移除觀察者B後 ===");
subject.notifyObservers("事件: 配置已更新");
}
}
=== 第一次通知 ===
觀察者A 收到通知: 事件: 系統啟動完成
觀察者B 收到通知: 事件: 系統啟動完成
觀察者C 收到通知: 事件: 系統啟動完成
=== 移除觀察者B後 ===
觀察者A 收到通知: 事件: 配置已更新
觀察者C 收到通知: 事件: 配置已更新
Java 內置 java.util.Observable/Observer(已棄用),推薦使用 PropertyChangeSupport 或 Spring ApplicationEventPublisher、Guava EventBus、RxJava 等成熟實現,提供線程安全、異步、異常隔離等能力。
嘗試擴展:
1. 事件分類通知(不同類型事件通知不同觀察者組)
2. 異步通知(線程池執行 update)
3. 觀察者優先級(按優先級順序通知)
4. 通知過濾(觀察者聲明關心的事件類型)