定義
觀察者模式(observer pattern),又被稱作發佈-訂閱模式(publish-subscribe pattern)、源-監聽器模式(source-listener pattern)、模型-視圖模式(model-view pattern)、從屬者模式(dependents pattern)。定義了一種一對多的依賴關係,一個主題對象可以被多個觀察者對象同時監聽。每當主題對象的狀態發生變化時,所有依賴它的對象都會得到通知並且自動更新。它屬於行爲型設計模式。
優缺點
優點:
觀察者與被觀察者松耦合,符合依賴倒置原則。
實現了一對多的通訊機制,支持事件註冊機制,支持興趣分發機制,即當被觀察者觸發事件時,只有感興趣的觀察者可以接收到通知。
分離了表示層(觀察者)和數據邏輯層(被觀察者),並且建立了一套觸發機制,使得數據變化可以響應到多個表示層上。
缺點:
如果觀察者數量過多,則事件通知時間會比較長。
事件通知呈線性關係,如果某一個觀察者處理事件卡殼,會影響後續的觀察者接收該事件。
如果觀察者和被觀察者存在循環依賴,則可能造成兩者之間的循環調用,導致系統崩潰。
使用場景
- 一個或者多個對象的變化依賴另一個對象的變化。
- 發佈-訂閱機制。
- 觸發機制。
概念源碼
僅供參考
實際應用
JDK原生的支持:
主題對象可以繼承Observable,觀察者對象實現Observer接口。在客戶端調用addObserver(Observer observer)。
e.g.
控制檯輸出如下:
Guava的支持:
觀察者對象的方法標註@Subscribe註解,客戶端調用EventBus.register(…)註冊標註@Subscribe註解的類,再調用post(…)方法即可。
e.g.
我這裏導入如下guava依賴。
控制檯輸出如下:
觸發-回調
e.g.
Event:
EventTrigger:
MouseEventTrigger:
EventCallback:
EventConstants:
Client:
最後控制檯輸出: