欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

Iron之觀察者

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、重慶網(wǎng)站建設(shè)、微信開發(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),同時也獲得了客戶的一致贊譽(yù)!

引言

上一篇說的職責(zé)鏈模式,很有意思的一個模式,今天這個模式也是很有意思的一個模式,還是不啰嗦了直接進(jìn)入主題吧。

場景介紹:在上一遍中說到用到部件檢測,很巧妙的讓調(diào)用者和處理者解耦了(沒有看過上篇的文章也沒關(guān)系,只是劇情是要接著發(fā)展的),要把部件拿去檢測是要讓個人來盯著看呢?還是部件生產(chǎn)好了自動就被拿去檢測了呢?毋庸置疑必須是自動化的。

看一下部件的結(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     }
 

這個部件還是上一篇的部件,沒有做任何改動。只是示例,為了讓沒看過上一篇的朋友知道。

按照場景里所要求的,定義了下面的兩個類型,ComponentModelFactory類型,ComponentModel類型工廠負(fù)責(zé)生產(chǎn)ComponentModel部件,并且在完成時通知要另外處理部件的對象。
ExecutionCheck類型,就是要要被通知到的對象,它等待著別人告訴它 “有部件生產(chǎn)好了,需要被你送去檢測”,不會它會很無聊。

 
1    /// <summary>
2    /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對象去檢測
3    /// </summary>
4     public class ComponentModelFactory
5     {
6         public static ComponentModel ComModelFactory()
7         {
8             return new ComponentModel();
9         }
10     }
11     /// <summary>
12     /// 送ComponentModel對象去檢測
13    /// </summary>
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很高興,因?yàn)樗谢罡闪耍抑荒芤赃@樣的方式去通知executionCheck,或許有人說修改下ComponentModelFactory類型會好一點(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)]問題了,可是ComponentModelFactory類型的內(nèi)部居然有著這樣高的耦合,無法忍受,必須得找出一種方式或者模式來解決這樣的難題,不然寢食難安!!!!

 

定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。

                                                                                                                          ——Gof

按照模式的定義重新來過(會有點(diǎn)不一樣的地方中心思想不變),先對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對象去檢測(觀察者)
11     /// </summary>
12     public class ExecutionCheck:ABSExecutionCheck
13     {
14         public override void ComponentModelCheck(ComponentModel comModel)
15         {
16             //送去執(zhí)行檢測
17             //或者是一些其他操作
18         }
19     }

然后再對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ì)原則的面對抽象編程的,當(dāng)然了最后一個PastMessage函數(shù)忽略掉,現(xiàn)在來看一下實(shí)現(xiàn)了抽象目標(biāo)ABSComponentModelFactory的ComponentModelFactory(具體目標(biāo))的實(shí)現(xiàn)。

1     /// <summary>
2     /// 示例ComponentModel類型工廠 生產(chǎn)了ComponentModel 通知ExecutionCheck對象去檢測  (具體目標(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)在再來看一下調(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)對象一樣。因?yàn)檫@里只是示例就不會很嚴(yán)謹(jǐn)。 還有要說的就是定義中是一對多,這樣可以修改ABSComponentModelFactory類型中的字段,修改為集合類型就可以了。 把對應(yīng)的實(shí)現(xiàn)類也適當(dāng)?shù)男薷囊幌戮涂梢粤恕?/pre>

 

觀察者就講到這里。下一篇是外觀,敬請期待。

 

網(wǎng)站名稱:C#設(shè)計(jì)模式之觀察者
標(biāo)題來源:http://www.chinadenli.net/article32/pegjsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)做網(wǎng)站網(wǎng)站導(dǎo)航響應(yīng)式網(wǎng)站微信公眾號網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)