Design Pattern - Observer Pattern

定義

觀察者模式(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:
在這裏插入圖片描述

最後控制檯輸出:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章