**:
假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。
現在假設熱水器由三部分組成:熱水器、警報器、顯示器,它們來自於不同廠商並進行了組裝。那麼,應該是熱水器僅僅負責燒水,它不能發出警報也不能顯示水溫;在水燒開時由警報器發出警報、顯示器顯示提示和水溫。
**如下:
//熱水器public
class
heater
}}//
警報器public
class
alarm 度了:
", param);
}}//
顯示器public
class
display度。
", param);
}}
這裡就出現了乙個問題:如何在水燒開的時候通知報警器和顯示器?在繼續進行之前,我們先了解一下observer設計模式,observer設計模式中主要包括如下兩類物件:
subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。
observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有警報器和顯示器,它們採取的行動分別是發出警報和顯示水溫。
在本例中,事情發生的順序應該是這樣的:
警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(註冊)。
熱水器知道後保留對警報器和顯示器的引用。
熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動呼叫警報器的makealert()方法、顯示器的showmsg()方法。
類似這樣的例子是很多的,gof對它進行了抽象,稱為observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。
**如下:
usingsystem;
using
system.collections.generic;
using
system.text;
namespace
delegate }}
}}
//警報器
public
class
alarm 度了:
", param);}}
//顯示器
public
class
display 度。
", param);}}
class
program
}}輸出為:
alarm:嘀嘀嘀,水已經
96度了:
alarm:嘀嘀嘀,水已經
96度了:
display:水快燒開了,當前溫度:96度。
//省略...
Observer 觀察者 設計模式
宣告 本博文篇幅短,適合review。一 概念 定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使他們能夠自動更新自己。二 模式結構圖 三 例子 四 優缺點 1 優點 a 降低了觀察者與被觀察者之間的耦合。b subject在傳...
Observer觀察者設計模式
observer設計模式主要包括以下兩種物件 1 被觀察物件 subject,它往往包含其他物件感興趣的東西,上面例子中熱水器中就是subject 被監視物件 2 觀察物件 observer,它觀察著subject,當subject中的某件事發生後,會告知observer,obersver會採取相應...
設計模式 觀察者模式(observer
有時被稱作發布 訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。很經典的是cegui中的事件通知模式 模式中的角色 1 抽象主題 它把所有觀察者物件的引用儲存到乙個聚集裡,每個主題都可...