什麼是觀察者模式
觀察者模式,也叫釋出-訂閱模式,定義了一種一對多的依賴關係,讓多個觀察者物件可以同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使觀察者能夠自動的更新自己。
觀察者模式的層次結構
抽象角色可以是介面,也可以是抽象類,我們按介面的方式來舉例
- 抽象通知者:基本結構為通知觀察者、新增觀察者和刪除觀察者,比如add(),delete(),notify()這些方法,如下圖的Informer
- 具體通知者:根據具體環境需求並實現抽象通知者所要求的介面的角色,如下圖的ConcreteInformer
- 抽象觀察者:基本結構為收到通知後的行為,比如update(),如下圖的Observer介面
- 具體觀察者:根據具體環境需求實現抽象觀察者的角色,如下圖的ConcreteObserver
觀察者模式的優缺點
優點
- 觀察者模式最好的效果是接觸耦合,耦合的雙方都依賴於抽象而不是具體,所以各自具體角色的變化都不會造成另一邊的變化。
缺點
- 如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。
- 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。
例項
抽象通知者:
具體通知者:
抽象觀察者:
具體觀察者:
客戶端:
從例項中,我們來看觀察者模式的優缺點:
- 優點:我們在客戶端中,比如可以只需修改通知者的具體類,而不用修改其他邏輯,就可以進行替換,並不會影響其他的部分
- 缺點:觀察者只是收到了通知者的通知,具體通知者發生了什麼變化,觀察者無從知道,比如新增了新的觀察者,而原有的觀察者並不知道
如果有什麼疑問或者是不足,歡迎大家討論和指出,謝謝。
參考資料
- 《大話設計模式》
- 《觀察者模式的優缺點以及使用場景(三)》