Observer設計模式

2022-02-21 11:58:03 字數 3395 閱讀 4976

observer設計模式是針對:乙個物件對多個物件中,乙個物件發生狀態改變,其他附屬物件發生相應的更新。是一種松耦合的設計模式。

例子:假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。

現在我們需要寫個程式來模擬這個燒水的過程,我們將定義乙個類來代表熱水器,我們管它叫:heater,它有代表水溫的字段,叫做temperature;當然,還有必不可少的給水加熱方法boilwater(),乙個發出語音警報的方法makealert(),乙個顯示水溫的方法,showmsg()。

namespace

delegate }}

//發出語音警報

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()方法。

1

using

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 }

1

using

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模式

目錄 具體實現總結 觀察者模式 發布 訂閱模式 是一種行為型模式,定義一系列物件之間的一對多關係,當乙個物件改變 更新狀態時,依賴它的都會收到通知改變或者更新。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種...