觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀态時,它的所有依賴着都會收到通知并自動更新。
觀察者模式,類圖:
<a href="http://s3.51cto.com/wyfs02/M00/11/A1/wKiom1LXgDiyfCTfAANzfqJqNF8113.jpg" target="_blank"></a>
利用觀察者模式,主題是具有狀态的對象,并且可以控制這些狀态。也就是說,有“一個”具有狀态的主題。另一方面,觀察者使用這些狀态,雖然這些狀态并不屬于他們。有許多觀察者,依賴主題來告訴他們狀态何時改變了。這就産生一個關系:“一個”主題對“多個”觀察者的關系。
當兩個對象之間松耦合,它們依然可以互動,但是不太清楚彼此的細節。而觀察者模式提供了一種對象設計,讓主題和觀察者之間松耦合。關于觀察者的一切,主題隻知道觀察者實作了某個接口(也就是Observer接口)。主題不需要知道觀察者的具體類是誰,做了些什麼或其他任何細節。假如有個新的具體類需要當觀察者,我們不需要為了相容新類型而修改主題的代碼,所有要做的就是在新的類裡實作此觀察者接口,然後注冊為觀察者即可。
觀察者模式遵循的設計原則:
1.為了互動對象之間的松耦合涉及而努力。松耦合的設計之是以能讓我們建立有彈性的面向對象系統,能夠應對變化,是因為對象之間的互相依賴降到了最低。
2.找出程式中會變化的方面,然後将其和固定不變的方面相分離。在觀察者模式中,會改變的是主題的狀态,以及觀察者的數目和類型。用這個模式,你可以改變依賴于主題狀态的對象,卻不必改變主題。
3.針對接口程式設計,不針對實作程式設計。主題與觀察者都是用接口:觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者。這樣可以讓兩者之間運作正常,又同時具有松耦合的優點。
4.多用組合,少用繼承。觀察者模式利用“組合”将許多觀察者組合進主題中,對象之間的這種關系不是通過繼承産生的,而是運作時利用組合的方式而産生的。
總結:
1.觀察者模式定義了對象之間一對多的關系。
2.主題(也就是可觀察者)用一個共同的接口來更新觀察者。
3.觀察者和可觀察者之間用松耦合方式結合,可觀察者不知道觀察者細節,隻知道觀察者實作了觀察者接口。
4.使用此模式時,你可以從被觀察者處推(push)或拉(pull)資料(然而,推的方式被認為更“正确”)。
5.有多個觀察者時,不可以依賴特定的通知次序。
<a href="http://down.51cto.com/data/2364001" target="_blank">附件:http://down.51cto.com/data/2364001</a>
本文轉自 ponpon_ 51CTO部落格,原文連結:http://blog.51cto.com/liuxp0827/1352257,如需轉載請自行聯系原作者