国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C#設(shè)計(jì)模式之觀察者

2019-11-17 03:10:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C#設(shè)計(jì)模式之觀察者

Iron之觀察者

引言

上一篇說(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             get10             {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 ExecutionCheck15     {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:ABSExecutionCheck13     {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ù)男薷囊幌戮涂梢粤恕?/p>

觀察者就講到這里。下一篇是外觀,敬請(qǐng)期待。

作者:金源

出處:http://m.survivalescaperooms.com/jin-yuan/

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新丰县| 莱西市| 江源县| 满洲里市| 平远县| 开平市| 阳信县| 古田县| 左云县| 荔波县| 洞口县| 科技| 定襄县| 永年县| 巴里| 东乡县| 唐河县| 光泽县| 鹿泉市| 郴州市| 苏尼特左旗| 灵丘县| 南岸区| 平邑县| 嫩江县| 安西县| 凤阳县| 东源县| 青河县| 嘉兴市| 宁化县| 温泉县| 香港| 新兴县| 三亚市| 湘潭县| 灵丘县| 信阳市| 五台县| 阳新县| 平南县|