大話設計模式之觀察者模式
他向著山下正在種田的農夫們大聲喊:“狼來了!狼來了!救命啊!
”農夫們聽到喊聲急忙拿著鋤頭和鐮刀往山上跑,他們邊跑喊:“不要怕,孩子,我們來幫你打惡狼!”農夫們氣喘籲籲地趕到山上一看,連狼的影子也沒有!放羊娃哈哈大笑:“真有意思,你們上當了!
”農夫們生氣地走了。第二天,放羊娃故伎重演,善良的農夫們又沖上來幫他打狼,可還是沒有見到狼的影子。
放羊娃笑得直不起腰:“哈哈。你們又上當了!哈哈。”大夥兒對放羊娃一而再再而三地說謊十分生氣,從此再也不相信他的話了。
過了幾天。狼真的來了。一下子闖進了羊群。
放羊娃害怕極了,拼命地向農夫們喊:“狼來了!
狼來了!
快救命呀!狼真的來了!
”農夫們聽到他的喊聲,以為他又在說謊,大家都不理睬他,沒有人去幫他,結果放羊娃的很多羊都被狼咬死了。小時候總是纏著爸爸給我講故事。爸爸不厭其煩的講著。我樂呵呵的聽著,就這樣我童年的生活在爸爸多姿多彩的故事中度過,當年聽這個故事。僅僅有一個感悟,做人要誠實。然而今天我換了一個角度看這個故事,搖身一變,她就成了我的設計模式--觀察者模式。
所謂的觀察者模式。在此種模式中,一個目標物件管理全部相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。首先來看一下我們觀察者模式的結構圖:
依舊以上述狼來了的故事為例。看看這個故事到底是如何在我們的編程中實現呢?簡單概括上述的故事就是。狼來了,放羊娃通知。農夫放下手頭工作趕來救羊:
using System; using System.Collections.Generic; using System.Text; namespace 觀察者模式 { class Program { static void Main(string[] args) { //狼來了 Wolf wolf = new Wolf(); //鋤草的農夫 WeedingObserver Farmer1 = new WeedingObserver(); //澆水的農夫 WateringObserver Farmer2 = new WateringObserver(); wolf.Update += new EventHandler(farmer1.StopWeeding); wolf.Update += new EventHandler(farmer2.StopWatering); //狼來了 wolf.SubjectState = "狼來了!"; //發出通知 wolf.Notify(); Console.Read(); } } //通知者接口 interface Subject { void Notify(); string SubjectState { get; set; } } //事件處理程序的托付 delegate void EventHandler(); class Shepherd: Subject { //聲明一事件Update。類型為托付EventHandler public event EventHandler Update; private string action; public void Notify() { Update(); } public string SubjectState { get { return action; } set { action = value; } } } class Wolf: Subject { //聲明一事件Update,類型為托付EventHandler public event EventHandler Update; private string action; public void Notify() { Update(); } public string SubjectState { get { return action; } set { action = value; } } } //鋤草的農夫 class WeedingObserver { private string name; private Subject sub; public WeedingObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //停止鋤草工作 public void StopWeeding() { Console.WriteLine("{0} {1} 停止鋤草工作,趕去救羊!觀察者模式:定義了一種一對多的依賴關系,讓多個觀察者對象同一時候監聽某一個主體對象,這個主題對象在狀態發生變化時,會通知全部觀察者。", sub.SubjectState, name); } } //澆水的農夫 class WateringObserver { private string name; private Subject sub; public WateringObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //停止澆水 public void StopWatering() { Console.WriteLine("{0} {1} 停止澆水工作,趕去救羊!
", sub.SubjectState, name); } } }
當一個對象改變須要同一時候改變其它對象,並且他不知道詳細有多少對象須要改變的時候,考慮使用觀察者模式。設計之旅,未完待續......
大話設計模式之觀察者模式