定義:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.(定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新。)
觀察者模式的通用類圖如圖所示。
我們先來解釋一下觀察者模式的幾個角色名稱:
- Subject被觀察者:定義被觀察者必須實現的職責,它必須能夠動態地增加、取消觀察者。它一般是抽象類或者是實現類,僅僅完成作爲被觀察這必須實現的職責:管理觀察者並通知觀察者。
- Observer觀察者:觀察者接收到消息後,機進行update(更新方法)操作,對接收到的信息進行處理。
- ConcreteSubject具體的被觀察者:定義被觀察者自己的業務邏輯,同時定義對哪些事情進行通知。
- ConcreteObserver具體的觀察者:每個觀察在接收到消息後的處理反應是不同,各個觀察者有自己的處理邏輯。
1.觀察者模式的應用
1.1觀察者模式的優點
- 觀察者和被觀察者之間是抽象耦合:如此設計,則不管是觀察者還是被觀察者都非常容易擴展,而且在Java中都已經實現的抽象層級的定義,在系統擴展方面更是得心應手。
- 建立一套觸發機制。
1.2觀察者模式的缺點
觀察者模式需要考慮一下開發效率和運行效率問題,一個被觀察者,多個觀察者,開發和調試就會比較複雜,而且在Java中消息的通知默認是順序執行,一個觀察者卡殼,會影響整體的執行效率。在這種情況下,一般考慮採用異步的方式。
多級觸發時效率更是讓人擔憂,大家在設計時注意考慮。
1.3觀察者模式的使用場景
- 關聯行爲場景。需要注意的是,關聯行爲是可拆分的,而不是“組合”關係。
- 事件多級觸發場景。
- 跨系統的消息交換場景,如消息隊列的處理機制。
1.4觀察者模式的注意事項
- 廣播鏈的問題。
- 異步處理問題。
其它設計模式內容戳這裏。