開發介面時常遇到:希望保留各組件獨立性,又需它們互相通信。以 Windows Explorer 為例,左側樹狀目錄點擊節點,右側檔案瀏覽需即時更新。若全部寫在單一 JFrame 子類中,雖易傳遞訊息但擴充性差。
常見兩種做法:
FilePanel 建構子傳入 JTree),造成緊耦合。Observer 屬於行為型設計模式,「定義物件間一對多依賴,當一物件狀態改變,所有依賴物件自動收到通知並更新」。完美符合組件通信需求。

此模式在實現 MVC 架構時極有用,實現資料與表示解耦。
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);
Observer 模式是解決 UI 組件通信、事件驅動系統、模型-視圖同步的經典選擇。