observer設計模式是針對:乙個物件對多個物件中,乙個物件發生狀態改變,其他附屬物件發生相應的更新。是一種松耦合的設計模式。
例子:假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。
現在我們需要寫個程式來模擬這個燒水的過程,我們將定義乙個類來代表熱水器,我們管它叫:heater,它有代表水溫的字段,叫做temperature;當然,還有必不可少的給水加熱方法boilwater(),乙個發出語音警報的方法makealert(),乙個顯示水溫的方法,showmsg()。
namespacedelegate }}
//發出語音警報
private
void makealert(int
param) 度了:
", param);
}//顯示水溫
private
void showmsg(int
param) 度。
", param);
}}class
program
}}
上面的例子顯然能完成我們之前描述的工作,但是卻並不夠好。現在假設熱水器由三部分組成:熱水器、警報器、顯示器,它們來自於不同廠商並進行了組裝。那麼,應該是熱水器僅僅負責燒水,它不能發出警報也不能顯示水溫;在水燒開時由警報器發出警報、顯示器顯示提示和水溫。
這時候,上面的例子就應該變成這個樣子:
1//熱水器
2public
class
heater 10}
11}1213
//警報器
14public
class
alarm 度了:
", param);17}
18}1920
//顯示器
21public
class
display度。
", param);24}
25 }
這裡就出現了乙個問題:如何在水燒開的時候通知報警器和顯示器?在繼續進行之前,我們先了解一下observer設計模式,observer設計模式中主要包括如下兩類物件:
subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。
observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有警報器和顯示器,它們採取的行動分別是發出警報和顯示水溫。
在本例中,事情發生的順序應該是這樣的:
警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(註冊)。
熱水器知道後保留對警報器和顯示器的引用。
熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動呼叫警報器的makealert()方法、顯示器的showmsg()方法。
1using
system;
2using
system.collections.generic;
3using
system.linq;
4using
system.text;
5using
system.threading;67
namespace
delegate_event823
}242526
//熱水器
27public
class
heater
2842}43
44}45}
4647
//報警器
48public
class
alarm
4957}58
}5960//
顯示器61
public
class
display
6268
}69 }
1using
system;
2using
system.collections.generic;
3using
system.text;45
namespace
delegate 21}
2223
//可以供繼承自 heater 的類重寫,以便繼承類拒絕其他物件對它的監視
24protected
virtual
void
onboiled(boiledeventargs e) 28}
2930
//燒水。
31public
void
boilwater() 39}
40}41}
4243
//警報器
44public
class
alarm - :
", heater.area, heater.type);
49 console.writeline("
alarm: 嘀嘀嘀,水已經 度了:
", e.temperature);
50console.writeline();51}
52}5354
//顯示器
55public
class
display - :
", heater.area, heater.type);
59 console.writeline("
display:水快燒開了,當前溫度:度。
", e.temperature);
60console.writeline();61}
62}6364
class
program 76}
77}7879
輸出為:
80 alarm:china xian - realfire 001
:81 alarm: 嘀嘀嘀,水已經 96
度了:82 alarm:china xian - realfire 001
:83 alarm: 嘀嘀嘀,水已經 96
度了:84 alarm:china xian - realfire 001
:85 alarm: 嘀嘀嘀,水已經 96
度了:86 display:china xian - realfire 001:87
display:水快燒開了,當前溫度:96度。
88//
省略 ...
設計模式Observer
observer設計模式的定義 定義了物件之間的一對多的依賴,這樣以來,當乙個物件改變狀態時,它的所有依賴者都會受到通知並自動更新。ifndef subjec h define subjec h include observer.h class subject subject subject sub...
設計模式 Observer
定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。dependents,publish subscribe 適用性 結構 允許你獨立的改變subject和observer。優缺點 1.建立subject到其observer之間的對映 最簡單的方法...
設計模式 Observer模式
目錄 具體實現總結 觀察者模式 發布 訂閱模式 是一種行為型模式,定義一系列物件之間的一對多關係,當乙個物件改變 更新狀態時,依賴它的都會收到通知改變或者更新。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種...