Iron之觀察者
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、重慶網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)成都企業(yè)網(wǎng)站定制等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:雨棚定制等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致贊譽(yù)!
引言
上一篇說(shuō)的職責(zé)鏈模式,很有意思的一個(gè)模式,今天這個(gè)模式也是很有意思的一個(gè)模式,還是不啰嗦了直接進(jìn)入主題吧。
場(chǎng)景介紹:在上一遍中說(shuō)到用到部件檢測(cè),很巧妙的讓調(diào)用者和處理者解耦了(沒(méi)有看過(guò)上篇的文章也沒(méi)關(guān)系,只是劇情是要接著發(fā)展的),要把部件拿去檢測(cè)是要讓個(gè)人來(lái)盯著看呢?還是部件生產(chǎn)好了自動(dòng)就被拿去檢測(cè)了呢?毋庸置疑必須是自動(dòng)化的。
看一下部件的結(jié)構(gòu)
1 /// <summary> 2 /// 部件 3 /// </summary> 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 }
這個(gè)部件還是上一篇的部件,沒(méi)有做任何改動(dòng)。只是示例,為了讓沒(méi)看過(guò)上一篇的朋友知道。
按照?qǐng)鼍袄锼蟮模x了下面的兩個(gè)類型,ComponentModelFactory類型,ComponentModel類型工廠負(fù)責(zé)生產(chǎn)ComponentModel部件,并且在完成時(shí)通知要另外處理部件的對(duì)象。
ExecutionCheck類型,就是要要被通知到的對(duì)象,它等待著別人告訴它 “有部件生產(chǎn)好了,需要被你送去檢測(cè)”,不會(huì)它會(huì)很無(wú)聊。
1 /// <summary> 2 /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對(duì)象去檢測(cè) 3 /// </summary> 4 public class ComponentModelFactory 5 { 6 public static ComponentModel ComModelFactory() 7 { 8 return new ComponentModel(); 9 } 10 } 11 /// <summary> 12 /// 送ComponentModel對(duì)象去檢測(cè) 13 /// </summary> 14 public class ExecutionCheck 15 { 16 public void ComponentModelCheck(ComponentModel comModel) 17 { 18 //送去執(zhí)行檢測(cè) 19 //或者是一些其他操作 20 } 21 }
來(lái)看看調(diào)用代碼:
1 ExecutionCheck executionCheck = new ExecutionCheck(); 2 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory()); 3 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory()); 4 executionCheck.ComponentModelCheck(ComponentModelFactory.ComModelFactory());
似乎是解決了問(wèn)題,但是結(jié)果糟透了,雖然executionCheck很高興,因?yàn)樗谢罡闪?,我只能以這樣的方式去通知executionCheck,或許有人說(shuō)修改下ComponentModelFactory類型會(huì)好一點(diǎn),我知道是這樣的:
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)]問(wèn)題了,可是ComponentModelFactory類型的內(nèi)部居然有著這樣高的耦合,無(wú)法忍受,必須得找出一種方式或者模式來(lái)解決這樣的難題,不然寢食難安?。。?!
定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
——Gof
按照模式的定義重新來(lái)過(guò)(會(huì)有點(diǎn)不一樣的地方中心思想不變),先對(duì)ExecutionCheck 類型進(jìn)行抽象
1 /// <summary> 2 /// 抽象的ExecutionCheck(抽象觀察者) 3 /// </summary> 4 public abstract class ABSExecutionCheck 5 { 6 public abstract void ComponentModelCheck(ComponentModel comModel); 7 } 8 9 /// <summary> 10 /// 送ComponentModel對(duì)象去檢測(cè)(觀察者) 11 /// </summary> 12 public class ExecutionCheck:ABSExecutionCheck 13 { 14 public override void ComponentModelCheck(ComponentModel comModel) 15 { 16 //送去執(zhí)行檢測(cè) 17 //或者是一些其他操作 18 } 19 }
然后再對(duì)ComponentModelFactory進(jìn)行改造,并且抽象它。
1 /// <summary> 2 /// 抽象目標(biāo) 3 /// </summary> 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類型實(shí)現(xiàn)的,從這里可以看出是遵循設(shè)計(jì)原則的面對(duì)抽象編程的,當(dāng)然了最后一個(gè)PastMessage函數(shù)忽略掉,現(xiàn)在來(lái)看一下實(shí)現(xiàn)了抽象目標(biāo)ABSComponentModelFactory的ComponentModelFactory(具體目標(biāo))的實(shí)現(xiàn)。
1 /// <summary> 2 /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對(duì)象去檢測(cè) (具體目標(biāo)) 3 /// </summary> 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)在再來(lái)看一下調(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()的地方可以動(dòng)態(tài)注入,和最后行的工廠生產(chǎn)對(duì)象一樣。因?yàn)檫@里只是示例就不會(huì)很嚴(yán)謹(jǐn)。 還有要說(shuō)的就是定義中是一對(duì)多,這樣可以修改ABSComponentModelFactory類型中的字段,修改為集合類型就可以了。 把對(duì)應(yīng)的實(shí)現(xiàn)類也適當(dāng)?shù)男薷囊幌戮涂梢粤恕?/pre>
觀察者就講到這里。下一篇是外觀,敬請(qǐng)期待。
網(wǎng)站名稱:C#設(shè)計(jì)模式之觀察者
標(biāo)題來(lái)源:http://aaarwkj.com/article32/pegjsc.html成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、做網(wǎng)站、網(wǎng)站導(dǎo)航、響應(yīng)式網(wǎng)站、微信公眾號(hào)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)