Iron之觀察者
喀什網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,喀什網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為喀什上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設公司要多少錢,請找那個售后服務好的喀什做網(wǎng)站的公司定做!引言
上一篇說的職責鏈模式,很有意思的一個模式,今天這個模式也是很有意思的一個模式,還是不啰嗦了直接進入主題吧。
場景介紹:在上一遍中說到用到部件檢測,很巧妙的讓調(diào)用者和處理者解耦了(沒有看過上篇的文章也沒關(guān)系,只是劇情是要接著發(fā)展的),要把部件拿去檢測是要讓個人來盯著看呢?還是部件生產(chǎn)好了自動就被拿去檢測了呢?毋庸置疑必須是自動化的。
看一下部件的結(jié)構(gòu)
1 ///2 /// 部件 3 /// 4 public class ComponentModel 5 { 6 public string Name { get; set; } 7 public int Value 8 { 9 get 10 { 11 return 5; 12 } 13 } 14 15 }
這個部件還是上一篇的部件,沒有做任何改動。只是示例,為了讓沒看過上一篇的朋友知道。
按照場景里所要求的,定義了下面的兩個類型,ComponentModelFactory類型,ComponentModel類型工廠負責生產(chǎn)ComponentModel部件,并且在完成時通知要另外處理部件的對象。
ExecutionCheck類型,就是要要被通知到的對象,它等待著別人告訴它 “有部件生產(chǎn)好了,需要被你送去檢測”,不會它會很無聊。
1 ///2 /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對象去檢測 3 /// 4 public class ComponentModelFactory 5 { 6 public static ComponentModel ComModelFactory() 7 { 8 return new ComponentModel(); 9 } 10 } 11 ///12 /// 送ComponentModel對象去檢測 13 /// 14 public class ExecutionCheck 15 { 16 public void ComponentModelCheck(ComponentModel comModel) 17 { 18 //送去執(zhí)行檢測 19 //或者是一些其他操作 20 } 21 }
來看看調(diào)用代碼:
1 ExecutionCheck executionCheck = new ExecutionCheck(); 2 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory()); 3 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory()); 4 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory());
似乎是解決了問題,但是結(jié)果糟透了,雖然executionCheck很高興,因為它有活干了,我只能以這樣的方式去通知executionCheck,或許有人說修改下ComponentModelFactory類型會好一點,我知道是這樣的:
1 public class ComponentModelFactory 2 { 3 public static ComponentModel ComModelFactory() 4 { 5 return new ComponentModel(); 6 } 7 public void PastMessage(ComponentModel componentModel,ExecutionCheck executionCheck) 8 { 9 executionCheck.ComponentModelCheck(componentModel); 10 } 11 }
調(diào)用代碼則調(diào)整為:
1 ComponentModelFactory componentModelFactory = new ComponentModelFactory(); 2 ExecutionCheck executionCheck=new ExecutionCheck(); 3 componentModelFactory.PastMessage(ComponentModelFactory.ComModelFactory(), executionCheck);
這樣的結(jié)果,調(diào)用方式?jīng)]問題了,可是ComponentModelFactory類型的內(nèi)部居然有著這樣高的耦合,無法忍受,必須得找出一種方式或者模式來解決這樣的難題,不然寢食難安!?。?!
定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。
——Gof
按照模式的定義重新來過(會有點不一樣的地方中心思想不變),先對ExecutionCheck 類型進行抽象
1 ///2 /// 抽象的ExecutionCheck(抽象觀察者) 3 /// 4 public abstract class ABSExecutionCheck 5 { 6 public abstract void ComponentModelCheck(ComponentModel comModel); 7 } 8 9 ///10 /// 送ComponentModel對象去檢測(觀察者) 11 /// 12 public class ExecutionCheck:ABSExecutionCheck 13 { 14 public override void ComponentModelCheck(ComponentModel comModel) 15 { 16 //送去執(zhí)行檢測 17 //或者是一些其他操作 18 } 19 }
然后再對ComponentModelFactory進行改造,并且抽象它。
1 ///2 /// 抽象目標 3 /// 4 public abstract class ABSComponentModelFactory 5 { 6 protected ABSExecutionCheck absExecutionCheck; 7 public abstract void RegisterABSExecutionCheck(ABSExecutionCheck executionCheck); 8 public abstract void ClearABSExecutionCheck(); 9 public abstract void PastMessage(ComponentModel componentModel); 10 }
ABSComponentModelFactory類型是要讓ComponentModelFactory類型實現(xiàn)的,從這里可以看出是遵循設計原則的面對抽象編程的,當然了最后一個PastMessage函數(shù)忽略掉,現(xiàn)在來看一下實現(xiàn)了抽象目標ABSComponentModelFactory的ComponentModelFactory(具體目標)的實現(xiàn)。
1 ///2 /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對象去檢測 (具體目標) 3 /// 4 public class ComponentModelFactory:ABSComponentModelFactory 5 { 6 public static ComponentModel ComModelFactory() 7 { 8 return new ComponentModel(); 9 } 10 11 public override void RegisterABSExecutionCheck(ABSExecutionCheck executionCheck) 12 { 13 absExecutionCheck = executionCheck; 14 } 15 16 public override void ClearABSExecutionCheck() 17 { 18 absExecutionCheck = null; 19 } 20 public override void PastMessage(ComponentModel componentModel) 21 { 22 absExecutionCheck.ComponentModelCheck(componentModel); 23 } 24 }
現(xiàn)在再來看一下調(diào)用的代碼:
1 ABSExecutionCheck executionCheck = new ExecutionCheck(); 2 ABSComponentModelFactory componentModelFactory = new ComponentModelFactory(); 3 componentModelFactory.RegisterABSExecutionCheck(executionCheck); 4 componentModelFactory.PastMessage(ComponentModelFactory.ComModelFactory());
這樣就比較穩(wěn)固了,在第一行new ExecutionCheck()的地方可以動態(tài)注入,和最后行的工廠生產(chǎn)對象一樣。因為這里只是示例就不會很嚴謹。 還有要說的就是定義中是一對多,這樣可以修改ABSComponentModelFactory類型中的字段,修改為集合類型就可以了。 把對應的實現(xiàn)類也適當?shù)男薷囊幌戮涂梢粤恕?/pre>觀察者就講到這里。下一篇是外觀,敬請期待。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁名稱:C#設計模式之觀察者-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://weahome.cn/article/dsidsj.html