成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#設(shè)計模式之職責(zé)鏈-創(chuàng)新互聯(lián)

Iron之職責(zé)鏈

創(chuàng)新互聯(lián)建站專注于肅州網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供肅州營銷型網(wǎng)站建設(shè),肅州網(wǎng)站制作、肅州網(wǎng)頁設(shè)計、肅州網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務(wù),打造肅州網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供肅州網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

需求:

"Iron"的建造一直沒有停止,現(xiàn)在單個部件是有的,但是在部件從工廠里出來的時候,在組裝到一起之前,我們還是非常有必要對部件進(jìn)行質(zhì)量檢測,或者是其它個方面的檢測,又或者是設(shè)置部件標(biāo)識信息等等,這些操作可以是有序的(也可以是無序的)。

現(xiàn)在為了實現(xiàn)上面的所講的功能來進(jìn)行演示,然過程中會發(fā)現(xiàn)問題,然后解決問題。這里不多說了直接進(jìn)入主題。

問題的發(fā)現(xiàn):

首先我定義了一個ComponentModel類,它是要被檢驗的對象

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     }

這里先定義了一個請求處理類型的枚舉,下面要用到,這樣比用什么字符串或者是數(shù)字來作條件判斷要好很多。

1     /// <summary>
2     /// 請求的處理類型
3    /// </summary>
4     public enum RequestState
5     {
6         /// <summary>
7         /// 檢測
8         /// </summary>
9         Check,
10         /// <summary>
11         /// 設(shè)置基礎(chǔ)值
12         /// </summary>
13         SetDefValue
14
15     }

再然后,我們再來定義檢驗ComponentModel類的類型:

1 /// <summary>
2     /// 處理請求類1
3     /// </summary>
4     public class ConcreteHandlerCaseOne
5     {
6         private ComponentModel _comModel;
7         public ConcreteHandlerCaseOne(ComponentModel comModel)
8         {
9             _comModel = comModel;
10         }
11         public void HandleRequest(RequestState reqState)
12         {
13             switch (reqState)
14             {
15                 case RequestState.Check:
16                     if (_comModel.Value > 5)
17                     {
18                     //執(zhí)行處理
19                     }
20                     break;
21                 case RequestState.SetDefValue:
22                     _comModel.Name = "默認(rèn)部件";
23                     //執(zhí)行處理
24                     break;
25                 default:
26
27                     break;
28             }
30         }
31     }
32     /// <summary>
33     /// 處理請求類2
34     /// </summary>
35     public class ConcreteHandlerCaseTwo
36     {
37         private ComponentModel _comModel;
38         public ConcreteHandlerCaseTwo(ComponentModel comModel)
39         {
40             _comModel = comModel;
41         }
42         public void HandleRequest(RequestState reqState)
43         {
44             switch (reqState)
45             {
46                 case RequestState.Check:
47                     if (_comModel.Value > 5)
48                     {
49                         //執(zhí)行處理
50                     }
51                     break;
52                 case RequestState.SetDefValue:
53                     _comModel.Name = "默認(rèn)部件";
54                     //執(zhí)行處理
55                     break;
56                 default:
57
58                     break;
59
60             }
61         }
62     }

定義了兩個類型,ConcreteHandlerCaseOne和ConcreteHandlerCaseTwo兩個類型,都是用來處理檢測ComponentModel類型的,現(xiàn)在這些類型都齊全了我們來檢測一下吧。

1 ComponentModel comModel = new ComponentModel();
2 ConcreteHandlerCaseOne caseone = new ConcreteHandlerCaseOn(comModel);
3 caseone.HandleRequest(RequestState.Check);
4 ConcreteHandlerCaseTwo casetwo = new ConcreteHandlerCaseTw(comModel);
5 casetwo.HandleRequest(RequestState.Check);
對的,就是這樣,一次次的檢測下去,如果要檢測20次,并且都是不同的實現(xiàn),那將非??膳?,代碼冗余,而且請求調(diào)用方和處理方的耦合度也很大,那要怎么樣讓代碼更精簡,并且還能有效的解耦,這里就要用到職責(zé)鏈模式。

為了避免請求的發(fā)送者和接收者之間的耦合關(guān)系,使多個接受對象都有機會處理請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
                                                                          ——Gof

這里要強調(diào)一下的是本篇的示例中并沒有完全遵從設(shè)計模式的定義,還是按照本文開始的功能需求來做的設(shè)計,當(dāng)然了模式的核心不變。

設(shè)計模式的思想:

現(xiàn)在先對處理方進(jìn)行抽象:


1     /// <summary>
2     /// 抽象處理者
3    /// </summary>
4     public abstract class Handle
5     {
6         protected Handle Successor;
7         public void SetSuccessor(Handle successor)
8         {
9             this.Successor = successor;
10         }
11         public abstract void HandleRequest(RequestStatereqState,ComponentModel comModel);
12
13     }

既然有了抽象,那就得有具體的實現(xiàn):


1 /// <summary>
2     /// 具體處理者
3     /// </summary>
4     public class ConcreteHandlerA : Handle
5     {
6         public override void HandleRequest(RequestState reqState, ComponentModel comModel)
7         {
8             switch (reqState)
9             {
10                 case RequestState.Check:
11                     //執(zhí)行處理
12
13                     break;
14                 case RequestState.SetDefValue:
15                     //執(zhí)行處理
16                     break;
17                 default:
18                     this.Successor.HandleRequest(reqState, comModel);
19                     break;
20
21             }
22         }
23     }
24     /// <summary>
25     /// 具體處理者
26     /// </summary>
27     public class ConcreteHandlerB : Handle
28     {
29         public override void HandleRequest(RequestState reqState, ComponentModel comModel)
30         {
31             switch (reqState)
32             {
33                 case RequestState.Check:
34                     //執(zhí)行處理
35                     break;
36                 case RequestState.SetDefValue:
37                     //執(zhí)行處理
38                     break;
39                 default:
40                     this.Successor.HandleRequest(reqState, comModel);
41                     break;
42
43             }
44         }
45     }

這里的類型應(yīng)該只定義一個的是為了讓大家看的更明白。

在這里看抽象處理者Handle類型,它里面有個protected級別的變量Successor,Successor呢就代表著鏈表中每一環(huán)的指針,指向誰呢?當(dāng)然是指向下一個處理者。
現(xiàn)在來看一下調(diào)用的代碼:

1 ComponentModel comModel = new ComponentModel();
2 Handle handlerA = new ConcreteHandlerA();
3 Handle handlerB = new ConcreteHandlerB();
4 handlerA.SetSuccessor(handlerB);
5 handlerA.HandleRequest(RequestState.Check, comModel);

看上去已經(jīng)不錯了,耦合度還是很大的,對于handlerA的調(diào)用,還是再調(diào)用方直接調(diào)用的,這時需要一個中間層,

看一下中間層的定義:

1     /// <summary>
2     /// ChainOfResponsibility模式幫助類
3    /// </summary>
4     public class CORUnit
5     {
6         private Handle _Handle;
7
8         private ComponentModel _ComModel;
9
10         public CORUnit(ComponentModel commodel)
11             : this(null, commodel)
12         {
13             _ComModel = commodel;
14         }
15         public CORUnit(Handle Handle, ComponentModel commodel)
16         {
17             _Handle = Handle;
18             _ComModel = commodel;
19         }
20         public void RegisterHandle(Handle handle)
21         {
22             if (_Handle != null)
23             {
24                 _Handle.SetSuccessor(handle);//指向 處理鏈中的下一個 處理模塊
25             }
26             else
27             {
28                 _Handle = handle;
29             }
30         }
31         public void HandleRequest(RequestState reqState)
32         {
33             _Handle.HandleRequest(reqState, _ComModel);
34         }
35     }

通過加了一層,再來看一下調(diào)用方的代碼:


1 ComponentModel comModel = new ComponentModel();
2 CORUnit corunit = new CORUnit(comModel);
3 corunit.RegisterHandle(new ConcreteHandlerA());
4 corunit.RegisterHandle(new ConcreteHandlerB());
5 corunit.HandleRequest(RequestState.Check);
6 //執(zhí)行處理
7 //comModel的一些處理

是不是感覺調(diào)用方,跟實際的處理方之間的關(guān)系變得很弱了,這樣目的也就達(dá)到了。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

新聞名稱:C#設(shè)計模式之職責(zé)鏈-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://jinyejixie.com/article0/dchgoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、移動網(wǎng)站建設(shè)微信小程序、網(wǎng)站排名網(wǎng)站收錄、小程序開發(fā)

廣告

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

網(wǎng)站托管運營
浑源县| 中牟县| 双城市| 九寨沟县| 孟津县| 普宁市| 平南县| 新乡县| 武汉市| 陵川县| 工布江达县| 新巴尔虎右旗| 武城县| 故城县| 绥德县| 双城市| 潼南县| 通道| 滨海县| 陆良县| 图木舒克市| 策勒县| 绍兴县| 桐庐县| 宜州市| 大英县| 石阡县| 敦煌市| 迭部县| 聂拉木县| 车险| 黔东| 永德县| 定日县| 岑巩县| 灵山县| 安远县| 乐东| 腾冲县| 武汉市| 托克逊县|