定義
定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新
使用場景
- 關聯行爲場景,需要注意的是關聯行爲是可拆分的,而不是“組合”關係
- 事件多級觸發場景
- 跨系統的消息交換場景,如消息隊列、事件總線處理機制
主要角色
Subject
抽象主題,也就是被觀察(Observable)的角色,抽象主題角色把所有觀察者對象的引用保存在一個集合裏,每個主題都可以有任意數量的觀察者,抽象主題提供一個接口,可以增加和刪除觀察者對象
Concrete Subject
具體主題,該角色將有關狀態存入具體觀察者對象,在具體主題的內部狀態發生改變時,給所有註冊過的觀察者發出通知,具體主題角色又叫做具體被觀察者角色(Concrete Observable)
Observer
抽象觀察者,該角色是觀察者的抽象類,它定義了一個更新接口,使得在得到主題的更改通知時更新自己
Concrete Observer
具體的觀察者,該角色實現抽象觀察者角色所定義的更新接口,以便在主題的狀態發生變化時更新自身的狀態
優點
- 觀察者和被觀察者直接是抽象耦合,應對業務變化
- 增強系統靈活性,可擴展性
缺點
在應用觀察者模式時需要考慮一下開發效率和運行效率問題,程序中包括一個被觀察者,多個觀察者,開發和調試會比較複雜,而且在java中消息的通知默認是順序執行,一個觀察者卡頓,會影響整體執行效率,在這種情況下,一般考慮採用異步的方式