GUI 開發中常需讓獨立組件(如左側樹、右側列表)互通消息。硬編碼引用導致高耦合;輪詢線程浪費資源。Observer 模式提供標準化解決方案。
定義一對多依賴:Subject(被觀察者)狀態變更時,自動通知所有註冊的 Observer(觀察者)。結構包含:
此模式是 MVC 架構解耦數據(Model)與視圖(View)的基石。
JDK 1.0 即提供標準 API:
Observer 接口:update(Observable o, Object arg)Observable 類:addObserver()、setChanged()、notifyObservers() 等注意:Observable 是類而非接口,Java 單繼承限制下常用組合模式(內部持有 Observable 實例)。
Sensor extends Observable。節點選擇時調用 sensor.setData(file) 並 notifyObservers()。Observer,update() 中從 Sensor 獲取文件名並加載圖片重繪。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()
}
Observable 非線程安全,多線程環境需自行同步或改用 PropertyChangeListener 等替代方案。Observer/Observable 標記 deprecated,新項目建議採用 java.beans 或 Reactive Streams 體系。