C設(shè)計(jì)模式職責(zé)鏈模式_第1頁(yè)
C設(shè)計(jì)模式職責(zé)鏈模式_第2頁(yè)
C設(shè)計(jì)模式職責(zé)鏈模式_第3頁(yè)
C設(shè)計(jì)模式職責(zé)鏈模式_第4頁(yè)
C設(shè)計(jì)模式職責(zé)鏈模式_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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)介

DesignPatterns職責(zé)鏈模式劉偉(Sunny)大綱行為型模式職責(zé)鏈模式概述職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的應(yīng)用實(shí)例純與不純的職責(zé)鏈模式職責(zé)鏈模式的優(yōu)缺點(diǎn)與適用環(huán)境2行為型模式行為型模式(BehavioralPattern)

關(guān)注系統(tǒng)中對(duì)象之間的交互,研究系統(tǒng)在運(yùn)行時(shí)對(duì)象之間的相互通信與協(xié)作,進(jìn)一步明確對(duì)象的職責(zé)行為型模式:不僅僅關(guān)注類和對(duì)象本身,還重點(diǎn)關(guān)注它們之間的相互作用和職責(zé)劃分3行為型模式類行為型模式使用繼承關(guān)系在幾個(gè)類之間分配行為,主要通過多態(tài)等方式來(lái)分配父類與子類的職責(zé)對(duì)象行為型模式使用對(duì)象的關(guān)聯(lián)關(guān)系來(lái)分配行為,主要通過對(duì)象關(guān)聯(lián)等方式來(lái)分配兩個(gè)或多個(gè)類的職責(zé)4行為型模式行為型模式一覽表模式名稱定義學(xué)習(xí)難度使用頻率職責(zé)鏈模式(ChainofResponsibilityPattern)避免將一個(gè)請(qǐng)求的發(fā)送者與接收者耦合在一起,讓多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求。將接收請(qǐng)求的對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象能夠處理它為止。★★★☆☆★★☆☆☆命令模式(CommandPattern)將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而讓你可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作?!铩铩铩睢睢铩铩铩铩罱忉屍髂J?InterpreterPattern)給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。★★★★★★☆☆☆☆迭代器模式(IteratorPattern)提供一種方法順序訪問一個(gè)聚合對(duì)象中的各個(gè)元素,且不用暴露該對(duì)象的內(nèi)部表示?!铩铩铩睢睢铩铩铩铩镏薪檎吣J?MediatorPattern)定義一個(gè)對(duì)象來(lái)封裝一系列對(duì)象的交互。中介者模式使各對(duì)象之間不需要顯式地相互引用,從而使其耦合松散,而且讓你可以獨(dú)立地改變它們之間的交互?!铩铩铩睢睢铩铩睢睢顐渫浤J?MementoPattern)在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),這樣可以在以后將對(duì)象恢復(fù)到原先保存的狀態(tài)?!铩铩睢睢睢铩铩睢睢钣^察者模式(ObserverPattern)定義對(duì)象之間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象都得到通知并被自動(dòng)更新?!铩铩铩睢睢铩铩铩铩餇顟B(tài)模式(StatePattern)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它的類?!铩铩铩睢睢铩铩铩睢畈呗阅J?StrategyPattern)定義一系列算法,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換,策略模式讓算法可以獨(dú)立于使用它的客戶變化?!铩睢睢睢睢铩铩铩铩钅0宸椒J?TemplateMethodPattern)定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。★★☆☆☆★★★☆☆訪問者模式(VisitorPattern)表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各個(gè)元素的操作。訪問者模式讓你可以在不改變各元素的類的前提下定義作用于這些元素的新操作?!铩铩铩铩睢铩睢睢睢?職責(zé)鏈模式概述獎(jiǎng)學(xué)金審批示意圖6職責(zé)鏈模式概述分析輔導(dǎo)員、系主任、院長(zhǎng)、校長(zhǎng)都可以處理獎(jiǎng)學(xué)金申請(qǐng)表,他們構(gòu)成一個(gè)處理申請(qǐng)表的鏈?zhǔn)浇Y(jié)構(gòu),申請(qǐng)表沿著這條鏈進(jìn)行傳遞,這條鏈就稱為職責(zé)鏈職責(zé)鏈可以是一條直線、一個(gè)環(huán)或者一個(gè)樹形結(jié)構(gòu),最常見的職責(zé)鏈?zhǔn)侵本€型,即沿著一條單向的鏈來(lái)傳遞請(qǐng)求7職責(zé)鏈模式概述職責(zé)鏈模式的定義對(duì)象行為型模式職責(zé)鏈模式:避免將一個(gè)請(qǐng)求的發(fā)送者與接收者耦合在一起,讓多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求。將接收請(qǐng)求的對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象能夠處理它為止。ChainofResponsibilityPattern:Avoidcouplingthesenderofarequesttoitsreceiverbygivingmorethanoneobjectachancetohandletherequest.Chainthereceivingobjectsandpasstherequestalongthechainuntilanobjecthandlesit.8職責(zé)鏈模式概述職責(zé)鏈模式的定義又稱為責(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)求的處理者解耦9職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的結(jié)構(gòu)10職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的結(jié)構(gòu)職責(zé)鏈模式包含以下兩個(gè)角色:Handler(抽象處理者)ConcreteHandler(具體處理者)11職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的實(shí)現(xiàn)典型的抽象處理者代碼:abstractclassHandler{ //維持對(duì)下家的引用

protectedHandlersuccessor;

publicvoidSetSuccessor(Handlersuccessor){ this.successor=successor; }

publicabstractvoidHandleRequest(stringrequest);}12職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的實(shí)現(xiàn)典型的具體處理者代碼:classConcreteHandler:Handler{ publicoverridevoidHandleRequest(stringrequest){ if(請(qǐng)求滿足條件){ //處理請(qǐng)求

} else{ this.successor.HandleRequest(request);//轉(zhuǎn)發(fā)請(qǐng)求

} }}13職責(zé)鏈模式的結(jié)構(gòu)與實(shí)現(xiàn)職責(zé)鏈模式的實(shí)現(xiàn)典型的客戶端代碼:……Handlerhandler1,handler2,handler3;handler1=newConcreteHandlerA();handler2=newConcreteHandlerB();handler3=newConcreteHandlerC();//創(chuàng)建職責(zé)鏈handler1.SetSuccessor(handler2);handler2.SetSuccessor(handler3);//發(fā)送請(qǐng)求,請(qǐng)求對(duì)象通常為自定義類型handler1.HandleRequest("請(qǐng)求對(duì)象");……14職責(zé)鏈模式的應(yīng)用實(shí)例實(shí)例說(shuō)明某企業(yè)的SCM(SupplyChainManagement,供應(yīng)鏈管理)系統(tǒng)中包含一個(gè)采購(gòu)審批子系統(tǒng)。該企業(yè)的采購(gòu)審批是分級(jí)進(jìn)行的,即根據(jù)采購(gòu)金額的不同由不同層次的主管人員來(lái)審批,主任可以審批5萬(wàn)元以下(不包括5萬(wàn)元)的采購(gòu)單,副董事長(zhǎng)可以審批5萬(wàn)元至10萬(wàn)元(不包括10萬(wàn)元)的采購(gòu)單,董事長(zhǎng)可以審批10萬(wàn)元至50萬(wàn)元(不包括50萬(wàn)元)的采購(gòu)單,50萬(wàn)元及以上的采購(gòu)單就需要開董事會(huì)討論決定。如下圖所示:采購(gòu)單分級(jí)審批示意圖現(xiàn)使用職責(zé)鏈模式設(shè)計(jì)并實(shí)現(xiàn)該系統(tǒng)。15職責(zé)鏈模式的應(yīng)用實(shí)例實(shí)例類圖采購(gòu)單分級(jí)審批結(jié)構(gòu)圖16職責(zé)鏈模式的應(yīng)用實(shí)例實(shí)例代碼(1)PurchaseRequest:采購(gòu)單類,充當(dāng)請(qǐng)求類(2)Approver:審批者類,充當(dāng)抽象處理者(3)Director:主任類,充當(dāng)具體處理者(4)VicePresident:副董事長(zhǎng)類,充當(dāng)具體處理者(5)President:董事長(zhǎng)類,充當(dāng)具體處理者(6)Congress:董事會(huì)類,充當(dāng)具體處理者(7)Program:客戶端測(cè)試類演示……參考代碼(DesignPattern\CoRSample)17職責(zé)鏈模式的應(yīng)用實(shí)例結(jié)果及分析增加一個(gè)經(jīng)理(Manager)角色//Manager.cs經(jīng)理類,充當(dāng)具體處理者usingSystem;namespaceCoRSample{classManager:Approver{publicManager(stringname):base(name){}//具體請(qǐng)求處理方法

publicoverridevoidProcessRequest(PurchaseRequestrequest){ if(request.Amount<80000){ Console.WriteLine("經(jīng)理{0}審批采購(gòu)單:{1},金額:{2}元,采購(gòu)目的:{3}。",,request.Number,request.Amount,request.Purpose);//處理請(qǐng)求

} else{ this.successor.ProcessRequest(request);//轉(zhuǎn)發(fā)請(qǐng)求

}}}}Approverrhuang;rhuang=newManager("黃蓉");客戶端代碼修改如下//創(chuàng)建職責(zé)鏈wjzhang.SetSuccessor(rhuang);//將“黃蓉”作為“張無(wú)忌”的下家rhuang.SetSuccessor(gyang);//將“楊過”作為“黃蓉”的下家gyang.SetSuccessor(jguo);jguo.SetSuccessor(meeting);主任張無(wú)忌審批采購(gòu)單:10001,金額:45000元,采購(gòu)目的:購(gòu)買倚天劍。經(jīng)理黃蓉審批采購(gòu)單:10002,金額:60000元,采購(gòu)目的:購(gòu)買《葵花寶典》。董事長(zhǎng)郭靖審批采購(gòu)單:10003,金額:160000元,采購(gòu)目的:購(gòu)買《金剛經(jīng)》。召開董事會(huì)審批采購(gòu)單:10004,金額:800000元,采購(gòu)目的:購(gòu)買桃花島。18純與不純的職責(zé)鏈模式純的職責(zé)鏈模式一個(gè)具體處理者對(duì)象只能在兩個(gè)行為中選擇一個(gè):要么承擔(dān)全部責(zé)任,要么將責(zé)任推給下家不允許出現(xiàn)某一個(gè)具體處理者對(duì)象在承擔(dān)了一部分或全部責(zé)任后又將責(zé)任向下傳遞的情況一個(gè)請(qǐng)求必須被某一個(gè)處理者對(duì)象所接收,不能出現(xiàn)某個(gè)請(qǐng)求未被任何一個(gè)處理者對(duì)象處理的情況19純與不純的職責(zé)鏈模式不純的職責(zé)鏈模式允許某個(gè)請(qǐng)求被一個(gè)具體處理者部分處理后向下傳遞,或者一個(gè)具體處理者處理完某請(qǐng)求后其后繼處理者可以繼續(xù)處理該請(qǐng)求一個(gè)請(qǐng)求可以最終不被任何處理者對(duì)象所接收并處理JavaScript的事件浮升(EventBubbling)處理機(jī)制20職責(zé)鏈模式的優(yōu)缺點(diǎn)與適用場(chǎng)景模式優(yōu)點(diǎn)使得一個(gè)對(duì)象無(wú)須知道是其他哪一個(gè)對(duì)象處理其請(qǐng)求,降低了系統(tǒng)的耦合度可簡(jiǎn)化對(duì)象之間的相互連接給對(duì)象職責(zé)的分配帶來(lái)更多的靈活性增加一個(gè)新

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論