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

利用 Observer 模式實現組件鬆耦合通信

     編輯:Java 相關知識

問題背景:組件間通信的困境

GUI 開發中常需讓獨立組件(如左側樹、右側列表)互通消息。硬編碼引用導致高耦合;輪詢線程浪費資源。Observer 模式提供標準化解決方案。

Observer 模式核心

定義一對多依賴:Subject(被觀察者)狀態變更時,自動通知所有註冊的 Observer(觀察者)。結構包含:

  • Subject:註冊/註銷 Observer,發送通知。
  • Observer:定義 update() 響應變更。
  • ConcreteSubject/ConcreteObserver:具體實現。

此模式是 MVC 架構解耦數據(Model)與視圖(View)的基石。

Java 內置支持:java.util.Observer / Observable

JDK 1.0 即提供標準 API:

  • Observer 接口:update(Observable o, Object arg)
  • Observable 類:addObserver()、setChanged()、notifyObservers() 等

注意:Observable 是類而非接口,Java 單繼承限制下常用組合模式(內部持有 Observable 實例)。

實戰案例:圖片瀏覽器

架構設計

  • LeftPanel(Subject):包含 JTree,組合 Sensor extends Observable。節點選擇時調用 sensor.setData(file) 並 notifyObservers()。
  • RightPanel(Observer):實現 Observer,update() 中從 Sensor 獲取文件名並加載圖片重繪。
  • MainFrame:組裝雙方,new LeftPanel(rightPanel) 完成註冊。

關鍵代碼片段

// LeftPanel 構造函數
public LeftPanel(Observer observer) {
    sensor = new Sensor();
    sensor.addObserver(observer);
    tree.addTreeSelectionListener(e -> {
        // ... 確定文件名 ...
        sensor.setData(file); // 觸發 setChanged()
        sensor.notifyObservers();
    });
}

// Sensor 內部類
class Sensor extends Observable {
    private Object data;
    public void setData(Object d) { data = d; setChanged(); }
    public Object getData() { return data; }
}

// RightPanel 實現 update
public void update(Observable o, Object arg) {
    String file = ((Sensor)o).getData();
    // 加載圖片、repaint()
}

優勢總結

  • 鬆耦合:Subject 無需知曉 Observer 具體類,僅依賴接口。
  • 擴展性:可動態增減 Observer,無需修改 Subject。
  • 資源友好:事件驅動替代輪詢,零 CPU 空轉。
  • 標準化:利用 JDK 內置 API,無第三方依賴。

避坑指南

  • Observable 非線程安全,多線程環境需自行同步或改用 PropertyChangeListener 等替代方案。
  • 通知順序不保證;若 Observer 處理耗時,考慮異步分發。
  • Java 9 起 Observer/Observable 標記 deprecated,新項目建議採用 java.beans 或 Reactive Streams 體系。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved