首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

設計模式精講:觀察者模式——構建響應式系統的發布-訂閱基石

     編輯:Java 相關知識

觀察者模式定義對象間一對多依賴,當主題狀態改變時,所有依賴者自動收到通知並更新。它是事件驅動架構、MVC 模式、響應式編程的核心基石。

一、 四大角色與通知流程

  • 抽象主題:管理觀察者集合,提供 attach/detach/notify。
  • 具體主題:業務邏輯載體,狀態變更時調用 notify()。
  • 抽象觀察者:聲明 update() 接口。
  • 具體觀察者:實現具體響應邏輯。

二、 代碼實現與線程安全

abstract class Subject {
    private List<Observer> observers = new CopyOnWriteArrayList<>(); // 線程安全
    public void attach(Observer o) { observers.add(o); }
    public void detach(Observer o) { observers.remove(o); }
    protected void notifyObservers() { observers.forEach(Observer::update); }
    public abstract void doBusiness();
}

class ConcreteSubject extends Subject {
    private String state;
    public void setState(String s) { state = s; doBusiness(); }
    public void doBusiness() { System.out.println("State changed: " + state); notifyObservers(); }
}

interface Observer { void update(); }

class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) { this.name = name; }
    public void update() { System.out.println(name + " received update"); }
}

使用 CopyOnWriteArrayList 避免并發修改異常,適合多線程環境。

三、 推/拉模型與 JDK 內建支援

  • 推模型:notify(data) 直接傳遞數據,觀察者被動接收。
  • 拉模型:notify() 僅通知,觀察者主動從主題拉取所需數據,耦合度更低。
  • JDK 支援:java.util.Observable(已棄用)+ Observer 接口;現代開發推薦 PropertyChangeListener、Guava EventBus、RxJava、Spring ApplicationEvent。

四、 優缺點與工程陷阱

優點缺點/風險
主題與觀察者抽象耦合,易擴展觀察者過多導致通知風暴,性能下降
動態訂閱/取消,運行時靈活循環引用導致死循環/棧溢出
符合開閉原則,新增觀察者無需改主題異步通知時異常處理複雜

五、 總結

觀察者模式是構建鬆耦合、可擴展系統的基石。實戰中需關注:通知同步/異步選擇、異常隔離、防循環依賴、內存洩漏(及時 detach)、大規模場景引入專業事件總線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved