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

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

     編輯:Java 程式設計入門

問題背景

開發介面時常遇到:希望保留各組件獨立性,又需它們互相通信。以 Windows Explorer 為例,左側樹狀目錄點擊節點,右側檔案瀏覽需即時更新。若全部寫在單一 JFrame 子類中,雖易傳遞訊息但擴充性差。

常見兩種做法:

  1. 組件間持有彼此引用(如 FilePanel 建構子傳入 JTree),造成緊耦合。
  2. 將組件執行緒化,輪詢監聽另一組件狀態,浪費系統資源。

Observer 模式解決方案

Observer 屬於行為型設計模式,「定義物件間一對多依賴,當一物件狀態改變,所有依賴物件自動收到通知並更新」。完美符合組件通信需求。

結構角色

  • Subject(被觀察者介面):提供觀察者註冊、註銷、通知方法。
  • Observer(觀察者介面):定義收到通知後的更新動作。
  • ConcreteSubject:Subject 具體實作,狀態改變時調用通知。
  • ConcreteObserver:Observer 具體實作,實現具體更新邏輯。

Observer 模式結構圖

此模式在實現 MVC 架構時極有用,實現資料與表示解耦。

Java 內建支援:java.util.Observer 與 Observable

JDK 1.0 即提供 Observer 介面與 Observable 類別,分別對應模式中的 Observer 與 Subject。

核心方法對照

Observer 介面Observable 類別
update(Observable o, Object arg):監控 subject,狀態變化時響應,arg 為 notifyObservers 傳遞參數addObserver(Observer o):觀察者註冊
setChanged():標記狀態已改變
notifyObservers() / notifyObservers(Object arg):通知所有觀察者
hasChanged():檢查狀態是否改變

使用範例

// 被觀察者:樹狀面板
class TreePanel extends Observable {
    private JTree tree;
    // 當節點選擇改變時
    public void onNodeSelected(String nodePath) {
        setChanged();
        notifyObservers(nodePath); // 傳遞節點路徑給觀察者
    }
}

// 觀察者:檔案面板
class FilePanel implements Observer {
    public void update(Observable o, Object arg) {
        if (o instanceof TreePanel && arg instanceof String) {
            String path = (String) arg;
            refreshFileList(path); // 根據路徑刷新檔案列表
        }
    }
}

// 組裝
TreePanel treePanel = new TreePanel();
FilePanel filePanel = new FilePanel();
treePanel.addObserver(filePanel);

優勢總結

  • 鬆耦合:主題與觀察者互不知彼此具體類別,僅依賴介面。
  • 動態關係:可隨時增減觀察者,無需修改主題代碼。
  • 廣播機制:一個事件自動通知多個觀察者。
  • 標準化:使用 JDK 內建 API,無需第三方庫。

Observer 模式是解決 UI 組件通信、事件驅動系統、模型-視圖同步的經典選擇。

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