21.設(shè)計(jì)模式.職責(zé)鏈模式(Chain-of-Responsibility)_第1頁(yè)
21.設(shè)計(jì)模式.職責(zé)鏈模式(Chain-of-Responsibility)_第2頁(yè)
21.設(shè)計(jì)模式.職責(zé)鏈模式(Chain-of-Responsibility)_第3頁(yè)
21.設(shè)計(jì)模式.職責(zé)鏈模式(Chain-of-Responsibility)_第4頁(yè)
21.設(shè)計(jì)模式.職責(zé)鏈模式(Chain-of-Responsibility)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、LOGO設(shè)計(jì)模式設(shè)計(jì)模式(Design Pattern) 張凱 副教授計(jì)算機(jī)學(xué)院 軟件工程系武漢科技大學(xué)問(wèn)題問(wèn)題(Problem)(Problem)v加薪、請(qǐng)假非要老總批? 每級(jí)領(lǐng)導(dǎo)都有一定限度的權(quán)利,對(duì)待申請(qǐng),需判斷是否有權(quán)來(lái)決策 經(jīng)理可以批2天以下請(qǐng)假,如果沒(méi)權(quán)利,向總監(jiān)上報(bào) 總監(jiān)可以批5天以下請(qǐng)假,如果沒(méi)權(quán)利,向總經(jīng)理上報(bào)武漢科技大學(xué)問(wèn)題問(wèn)題(Problem)(Problem) class Request /申請(qǐng) /申請(qǐng)類(lèi)別 private string requestType; public string RequestType get return requestType; set

2、requestType = value; /申請(qǐng)內(nèi)容 private string requestContent; public string RequestContent get return requestContent; set requestContent = value; /數(shù)量 private int number; public int Number get return number; set number = value; 武漢科技大學(xué)問(wèn)題問(wèn)題(Problem)(Problem) class Manager protected string name; public Mana

3、ger(string name) = name; public void GetResult(ManagerLevel managerLevel, Request request) if (managerLevel = ManagerLevel.經(jīng)理) if (request.RequestType = 請(qǐng)假 & request.Number = 2) Console.WriteLine(0:1 數(shù)量2 被批準(zhǔn), name, request.RequestContent, request.Number); else Console.WriteLine(0:1 數(shù)量2

4、 我無(wú)權(quán)處理, name, request.RequestContent, request.Number); else if (managerLevel = ManagerLevel.總監(jiān)) if (request.RequestType = 請(qǐng)假 & request.Number = 5) Console.WriteLine(0:1 數(shù)量2 被批準(zhǔn), name, request.RequestContent, request.Number); else Console.WriteLine(0:1 數(shù)量2 我無(wú)權(quán)處理, name, request.RequestContent, req

5、uest.Number); else if (managerLevel = ManagerLevel.總經(jīng)理) if (request.RequestType = 請(qǐng)假) Console.WriteLine(0:1 數(shù)量2 被批準(zhǔn), name, request.RequestContent, request.Number); else if (request.RequestType = 加薪 & request.Number 500) Console.WriteLine(0:1 數(shù)量2 再說(shuō)吧, name, request.RequestContent, request.Number)

6、; 武漢科技大學(xué)問(wèn)題問(wèn)題(Problem)(Problem) static void Main(string args) Manager jinli = new Manager(金利); Manager zongjian = new Manager(宗劍); Manager zhongjingli = new Manager(鐘精勵(lì)); Request request = new Request(); request.RequestType = 加薪; request.RequestContent = 張三請(qǐng)求加薪; request.Number = 1000; jinli.GetResult

7、(ManagerLevel.經(jīng)理, request); zongjian.GetResult(ManagerLevel.總監(jiān), request); zhongjingli.GetResult(ManagerLevel.總經(jīng)理, request); Request request2 = new Request(); request2.RequestType = 請(qǐng)假; request2.RequestContent = 張三請(qǐng)假; request2.Number = 3; jinli.GetResult(ManagerLevel.經(jīng)理, request2); zongjian.GetResult

8、(ManagerLevel.總監(jiān), request2); zhongjingli.GetResult(ManagerLevel.總經(jīng)理, request2); Console.Read(); 武漢科技大學(xué)主要內(nèi)容主要內(nèi)容模式動(dòng)機(jī)與定義1模式結(jié)構(gòu)與分析2模式實(shí)例與解析3模式效果與應(yīng)用4武漢科技大學(xué)v模式動(dòng)機(jī) 模式名稱(chēng):職責(zé)鏈模式(Chain of Responsibility) 職責(zé)鏈可以是一條直線、一個(gè)環(huán)或者一個(gè)樹(shù)形結(jié)構(gòu),最常見(jiàn)的職責(zé)鏈?zhǔn)侵本€型,即沿著一條單向的鏈來(lái)傳遞請(qǐng)求。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)

9、武漢科技大學(xué)v模式動(dòng)機(jī) 鏈上的每一個(gè)對(duì)象都是請(qǐng)求處理者,職責(zé)鏈模式可以將請(qǐng)求的處理者組織成一條鏈,并使請(qǐng)求沿著鏈傳遞,由鏈上的處理者對(duì)請(qǐng)求進(jìn)行相應(yīng)的處理。 客戶端無(wú)須關(guān)心請(qǐng)求的處理細(xì)節(jié)以及請(qǐng)求的傳遞,只需將請(qǐng)求發(fā)送到鏈上即可,將請(qǐng)求的發(fā)送者和請(qǐng)求的處理者解耦。這就是職責(zé)鏈模式的模式動(dòng)機(jī)。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)v模式定義 職責(zé)鏈模式(Chain of Responsib

10、ility Pattern):避免請(qǐng)求發(fā)送者與接收者耦合在一起,讓多個(gè)對(duì)象都有可能接收請(qǐng)求,將這些對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有對(duì)象處理它為止。職責(zé)鏈模式又稱(chēng)為責(zé)任鏈模式,它是一種對(duì)象行為型模式。武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility) /申請(qǐng) class Request /申請(qǐng)類(lèi)別 private string requestType; public s

11、tring RequestType get return requestType; set requestType = value; /申請(qǐng)內(nèi)容 private string requestContent; public string RequestContent get return requestContent; set requestContent = value; /數(shù)量 private int number; public int Number get return number; set number = value; 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Respo

12、nsibility)(Chain of Responsibility) /管理者 abstract class Manager protected string name; /管理者的上級(jí) protected Manager superior; public Manager(string name) = name; /設(shè)置管理者的上級(jí) public void SetSuperior(Manager superior) this.superior = superior; /申請(qǐng)請(qǐng)求 abstract public void RequestApplications(Reques

13、t request); 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility) class CommonManager : Manager /經(jīng)理 public CommonManager(string name) : base(name) public override void RequestApplications(Request request) if (request.RequestType = 請(qǐng)假 & request.Number = 2) Console.WriteLine(0:1 數(shù)量2 被

14、批準(zhǔn), name, request.RequestContent, request.Number); else if (superior != null) superior.RequestApplications(request); 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility) class Majordomo : Manager /總監(jiān) public Majordomo(string name) : base(name) public override void RequestApplications(Re

15、quest request) if (request.RequestType = 請(qǐng)假 & request.Number = 5) Console.WriteLine(0:1 數(shù)量2 被批準(zhǔn), name, request.RequestContent, request.Number); else if (superior != null) superior.RequestApplications(request); 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility) class GeneralManage

16、r : Manager /總經(jīng)理 public GeneralManager(string name) : base(name) public override void RequestApplications(Request request) if (request.RequestType = 請(qǐng)假) Console.WriteLine(0:1 數(shù)量2 被批準(zhǔn), name, request.RequestContent, request.Number); else if (request.RequestType = 加薪 & request.Number 500) Console.W

17、riteLine(0:1 數(shù)量2 再說(shuō)吧, name, request.RequestContent, request.Number); 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility) static void Main(string args) CommonManager jinli = new CommonManager(金利); Majordomo zongjian = new Majordomo(宗劍); GeneralManager zhongjingli = new GeneralManager(鐘

18、精勵(lì)); jinli.SetSuperior(zongjian); zongjian.SetSuperior(zhongjingli); Request request = new Request(); request.RequestType = 請(qǐng)假; request.RequestContent = 張三請(qǐng)假; request.Number = 1; jinli.RequestApplications(request); Request request3 = new Request(); request3.RequestType = 加薪; request3.RequestContent

19、= 張三請(qǐng)求加薪; request3.Number = 500; jinli.RequestApplications(request3); Console.Read(); 武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)靈活在哪?如果項(xiàng)目經(jīng)理不在,代碼如何寫(xiě)?1. 改變內(nèi)部的傳遞規(guī)則。2. 可以從職責(zé)鏈任何一關(guān)開(kāi)始。武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Respons

20、ibility)(Chain of Responsibility) static void Main(string args) CommonManager jinli = new CommonManager(金利); / Majordomo zongjian = new Majordomo(宗劍); GeneralManager zhongjingli = new GeneralManager(鐘精勵(lì)); jinli.SetSuperior(zhongjingli); / zongjian.SetSuperior(zhongjingli); Request request = new Requ

21、est(); request.RequestType = 請(qǐng)假; request.RequestContent = 張三請(qǐng)假; request.Number = 1; jinli.RequestApplications(request); Request request3 = new Request(); request3.RequestType = 加薪; request3.RequestContent = 張三請(qǐng)求加薪; request3.Number = 500; jinli.RequestApplications(request3); Console.Read(); 武漢科技大學(xué)職責(zé)鏈

22、模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)v模式結(jié)構(gòu) 職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)v參與者 Handler: 抽象處理者 ConcreteHandler: 具體處理者 Client: 客戶類(lèi)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of

23、Responsibility)一個(gè)職責(zé)鏈可以是一條線,一個(gè)樹(shù),也可以是一個(gè)環(huán)。如上圖所示,責(zé)任鏈?zhǔn)且粋€(gè)樹(shù)結(jié)構(gòu)的一部分。武漢科技大學(xué)v職責(zé)鏈模式和狀態(tài)模式比較 職責(zé)鏈模式:當(dāng)客戶提交一個(gè)請(qǐng)求時(shí),請(qǐng)求是沿鏈傳遞直至有一個(gè)ConcreteHander對(duì)象負(fù)責(zé)處理它。鏈中的對(duì)象自己并不知道鏈的結(jié)構(gòu),在運(yùn)行時(shí)確定。結(jié)果是職責(zé)鏈可簡(jiǎn)化對(duì)象的相互連接,它們僅需保持一個(gè)指向其后繼者的引用或指針,而不需要保持它所有的候選接受者。這也就大大降低了耦合度了。也就是說(shuō),我們可以隨時(shí)地增加或修改處理一個(gè)請(qǐng)求的結(jié)構(gòu)。增強(qiáng)了給對(duì)象指派職責(zé)的靈活性。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Ch

24、ain of Responsibility)武漢科技大學(xué)v職責(zé)鏈模式和狀態(tài)模式比較 狀態(tài)模式:狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類(lèi)當(dāng)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。定義新的子類(lèi)可以很容易地增加新的狀態(tài)和轉(zhuǎn)換。這樣做的目的是為了消除龐大的條件分支語(yǔ)句。狀態(tài)模式通過(guò)把各種狀態(tài)轉(zhuǎn)移邏輯分布到State的子類(lèi)之間,來(lái)減少相互間的依賴。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)v職責(zé)鏈模式和狀態(tài)模式比較 請(qǐng)假例子,找班長(zhǎng)請(qǐng)假,班長(zhǎng)只能請(qǐng)半天

25、,否則班長(zhǎng)向老師申請(qǐng),如果請(qǐng)假時(shí)間超過(guò)一周,老師要跟副年級(jí)主任請(qǐng)示,如果請(qǐng)假超出一個(gè)月,主任要跟年級(jí)正主任請(qǐng)示,然后被批準(zhǔn),或不被批準(zhǔn)。 問(wèn)題:如果班長(zhǎng)請(qǐng)假了,用狀態(tài)模式,其他學(xué)生都請(qǐng)不了假了,也就是如果狀態(tài)模式中任何一環(huán)缺失的話,這個(gè)事件都無(wú)法進(jìn)行下去。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)v職責(zé)鏈模式和狀態(tài)模式比較 職責(zé)鏈模式的鏈?zhǔn)皆诳蛻舳诉B接的,也就是說(shuō),如果我們請(qǐng)假,請(qǐng)假制度一旦改變,比如說(shuō)我們不需要班長(zhǎng),或者是先請(qǐng)求老師后直接請(qǐng)求主任或者中間多了一個(gè)環(huán)節(jié),都是很容易實(shí)現(xiàn)的,所以,職責(zé)鏈模式要比狀態(tài)模式靈活很多。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)v職責(zé)鏈模式和狀態(tài)模式比較 職責(zé)鏈模式與狀態(tài)模式的最大的不同是設(shè)置自己的下一級(jí)的問(wèn)題上,狀態(tài)模式是在類(lèi)的設(shè)計(jì)階段就定好的,不能在客戶端改變,而職責(zé)鏈的下一級(jí)是在客戶端自己來(lái)確定的。 職責(zé)鏈模式注重職責(zé)的傳遞,由客戶端配置;狀態(tài)模式注重對(duì)象狀態(tài)的轉(zhuǎn)換,轉(zhuǎn)換過(guò)程對(duì)客戶端是透明的。職責(zé)鏈模式職責(zé)鏈模式(Chain of Responsibility)(Chain of Respons

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論