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

下載本文檔

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

文檔簡介

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

2、requestType = value; /申請內(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é)問題問題(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 = 請假 & request.Number = 2) Console.WriteLine(0:1 數(shù)量2 被批準, name, request.RequestContent, request.Number); else Console.WriteLine(0:1 數(shù)量2

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

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

6、; 武漢科技大學(xué)問題問題(Problem)(Problem) static void Main(string args) Manager jinli = new Manager(金利); Manager zongjian = new Manager(宗劍); Manager zhongjingli = new Manager(鐘精勵); Request request = new Request(); request.RequestType = 加薪; request.RequestContent = 張三請求加薪; 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 = 請假; request2.RequestContent = 張三請假; 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)容模式動機與定義1模式結(jié)構(gòu)與分析2模式實例與解析3模式效果與應(yīng)用4武漢科技大學(xué)v模式動機 模式名稱:職責鏈模式(Chain of Responsibility) 職責鏈可以是一條直線、一個環(huán)或者一個樹形結(jié)構(gòu),最常見的職責鏈是直線型,即沿著一條單向的鏈來傳遞請求。職責鏈模式職責鏈模式(Chain of Responsibility)(Chain of Responsibility)

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

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

11、tring RequestType get return requestType; set requestType = value; /申請內(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é)職責鏈模式職責鏈模式(Chain of Respo

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

13、t request); 武漢科技大學(xué)職責鏈模式職責鏈模式(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 = 請假 & request.Number = 2) Console.WriteLine(0:1 數(shù)量2 被

14、批準, name, request.RequestContent, request.Number); else if (superior != null) superior.RequestApplications(request); 武漢科技大學(xué)職責鏈模式職責鏈模式(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 = 請假 & request.Number = 5) Console.WriteLine(0:1 數(shù)量2 被批準, name, request.RequestContent, request.Number); else if (superior != null) superior.RequestApplications(request); 武漢科技大學(xué)職責鏈模式職責鏈模式(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 = 請假) Console.WriteLine(0:1 數(shù)量2 被批準, name, request.RequestContent, request.Number); else if (request.RequestType = 加薪 & request.Number 500) Console.W

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

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

19、= 張三請求加薪; request3.Number = 500; jinli.RequestApplications(request3); Console.Read(); 武漢科技大學(xué)職責鏈模式職責鏈模式(Chain of Responsibility)(Chain of Responsibility)武漢科技大學(xué)職責鏈模式職責鏈模式(Chain of Responsibility)(Chain of Responsibility)靈活在哪?如果項目經(jīng)理不在,代碼如何寫?1. 改變內(nèi)部的傳遞規(guī)則。2. 可以從職責鏈任何一關(guān)開始。武漢科技大學(xué)職責鏈模式職責鏈模式(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(鐘精勵); jinli.SetSuperior(zhongjingli); / zongjian.SetSuperior(zhongjingli); Request request = new Requ

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論