觀察者定義了一種一對多的依賴關系,當一個主題(subject)對象狀态發生變化時,所有依賴它的相關對象都會得到通知并且能夠自動更新自己的狀态,這些依賴的對象稱之為觀察者(observer)對象這類似于釋出/訂閱模式。
觀察者模式中的主題對象,會維持着一個依賴它的觀察者對象清單,當主題對象狀态發生改變時,主題對象便會調用這個清單中所有觀察者對象的方法。
觀察者模式一般用在分布式時間處理系統,它也是流行的mvc模型的核心設計模式。
觀察者模式主要涉及到三個元件:subject、observer、concreteobserver
主題(subject):儲存了所有觀察者的引用,并供注冊、删除觀察者的接口,提供自己狀态變化觸發所有觀察者更新的方法
觀察者(observer):定義了更新自己狀态的接口
具體觀察者( concreteobserver):具體實作觀察者接口,使自己的狀态和主題狀态一緻
我們看一下運作結果:
當主題對象狀态發生改變,兩個注冊的觀察者都收到了通知。
其實觀察者模式很簡單,其核心内涵依然是用面向對象思想思考問題而非面向過程思想,面向接口程式設計,解耦合依賴。
但是觀察者模式也有缺點,觀察者模式是一種常用的鍊式觸發機制,由于是鍊式觸發,當觀察者比較多的時候,性能問題是比較令人擔憂的。并且,在鍊式結構中,比較容易出現循環引用的錯誤,造成系統假死。