今天在做項目時候,用到觀察者模式。使用起來還不是很順溜,解讀了幾篇文章後,在我印象中觀察者模式是這樣的。
觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀态發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。
從網上看到一個類圖來展示觀察者模式。感覺說的很詳細,也容易懂,大家可以參考下圖來了解觀察者模式。
ConcreteSubject類繼承自Subject類,屬于抽象通知者,相當于發信号的人。ConcreteObserver繼承Observer屬于信号的接收者。觀察者模式,不希望為了維持一緻性而使類緊密耦合,這樣給維護、擴充和重用帶來不便。一個Subject可以有任意數目的依賴它的Observer,一旦Subject的狀态發生了改變,所有的Observer都可以得到通知。Subject發出通知時并不需要知道誰是它的觀察者。而任何一個具體觀察者不知道也不需要知道其他觀察者的存在。當一個對象的改變需要同時改變其他對象的時候,而且它不知道具體有多少對象有待改變時,應該考慮觀察者模式。
觀察者模式所做的工作其實就是在解耦合。讓耦合的雙方都依賴于抽象,而不是依賴于具體。進而使得各自的變化都不會影響另一邊的變化。
Key-Value Observing(KVO)實作
熟悉KVO的朋友都知道,隻有當我們調用KVC去通路key值的時候KVO才會起作用。是以肯定确定的是,KVO是基于KVC實作的。因為KVC的實作機制,可以很容易看到某個KVC操作的Key,而後也很容易的跟觀察者系統資料庫中的Key進行匹對。假如通路的Key是被觀察的Key,那麼我們在内部就可以很容易的到觀察者系統資料庫中去找到觀察者對象,而後給他發送消息。
參考連結:http://www.ohcoder.com/post/2012-03-12/15755494