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)在單個部件是有的,但是在部件從工廠里出來的時候,在組裝到一起之前,我們還是非常有必要對部件進行質(zhì)量檢測,或者是其它個方面的檢測,又或者是設(shè)置部件標(biāo)識信息等等,這些操作可以是有序的(也可以是無序的)。
現(xiàn)在為了實現(xiàn)上面的所講的功能來進行演示,然過程中會發(fā)現(xià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)在先對處理方進行抽象:
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://redsoil1982.com.cn/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)
猜你還喜歡下面的內(nèi)容