设计模式学习笔记--Chain Of Responsibility 职责链模式.docx_第1页
设计模式学习笔记--Chain Of Responsibility 职责链模式.docx_第2页
设计模式学习笔记--Chain Of Responsibility 职责链模式.docx_第3页
设计模式学习笔记--Chain Of Responsibility 职责链模式.docx_第4页
设计模式学习笔记--Chain Of Responsibility 职责链模式.docx_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

职责链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。 引入职责链模式的目的仍然是为了解除耦合,从“封装变化”的角度出发,它封装了“职责行为的变化”,同时又利用链结构保证了消息的传递,此模式的优势在于它能够“智能”地根据条件在职责链中定位到合适的对象,并执行其职能。 职责链模式的UML图如下:责任链模式涉及到的角色如下所示:1、抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。2、具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 下面,我们还是用代码来说明。 程序如下图:一、职责链模式的基本思路 1、抽象处理者(Handler)角色:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyChainResponsibilityabstractclassHandler/定义一个设置下一个处理者的接口protectedHandler_successor;publicvoidSetSuccessor(Handlersucessor)this._successor=sucessor;/定义一个处理信息的接口publicabstractvoidHandleRequest(intrequest); 2、具体处理者(ConcreteHandler)角色usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyChainResponsibility第一个处理者第二个处理者第三个处理者 3、客户端应用#region基本思路示例Console.WriteLine(-基本思路示例-);Handlerh1=newConcreteHandlerOne();Handlerh2=newConcreteHandlerTwo();Handlerh3=newConcreteHandlerThree();/设置责任链h1.SetSuccessor(h2);h2.SetSuccessor(h3);intrequests=2,5,21,22,18,26,89;foreach(intrequestinrequests)/责任处理h1.HandleRequest(request);Console.ReadKey();#endregion二、关于办公室发票报销的职责链处理模式 办公室的发票,根据它们的金额大小分别由科长,处长,局长逐级负责审阅报批,职责链处理流程从科长到处长再到局长。代码如下 1、抽象处理者(Handler)角色:ApproveHandler.usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyChainResponsibilityabstractclassApproveHandler#region职务属性privatestringheadship;publicstringHeadShipgetreturnheadship;setheadship=value;#endregion#region构造函数publicApproveHandler(stringHeadShip)this.headship=HeadShip;#endregion#region设置后继者接口protectedApproveHandler_successor;publicvoidSetSuccessor(ApproveHandlersuccessor)this._successor=successor;#endregion#region处理职责接口publicabstractvoidHandleRequest(Receiptrequest);#endregion 2、具体处理者(ConcreteHandler)角色:ConcreteApproveHandlersusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyChainResponsibility科长处长局长 3、客户端应用Receipt发票类定义usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyChainResponsibility#region发票类classReceiptprivatedouble_amount;privatestring_purpose;/构造函数publicReceipt(doubleamount,stringpurpose)this._amount=amount;this._purpose=purpose;#region金额publicdoubleAmountgetreturn_amount;set_amount=value;#endregion#region用途publicstringPurposegetreturn_purpose;set_purpose=value;#endregion#endregion 客户端应用#region办公室报销责任链Console.WriteLine(-办公室报销责任链-);KeZhangke=newKeZhang(科长);ChuZhangchu=newChuZhang(处长);JuZhangju=newJuZhang(局长);Receiptr1=newReceipt(360,请客吃饭.);Receiptr2=newReceipt(760,处室活动开销.);Receiptr3=newReceipt(360,采购办公用品.);/设置责任链ke.SetSuccessor(chu);chu.SetSuccessor(ju);/责任处理ke.HandleRequest(r1);ke.HandleRequest(r2);ke.HandleRequest(r3);Console.ReadKey();#endregion总结1、何时采用 从代码角度来说,如果一个逻辑的处理由不同责任对象完成,客户端希望能自定义这个处理流程并且不希望直接和多个责任对象发生耦合的时候可以考虑责任链模式。从应用角度来说,如果对一个事情的处理存在一个流程,需要经历不同的责任点进行处理,并且这个流程比较复杂或只希望对外公开一个流程的入口点的话可以考虑责任链模式。其实,责任链模式还可以在构架的层次进行应用,比如.NET中的层次异常处理关系就可以看作是一种责任链模式。2、实现要点(1)有一个抽象责任角色,避免各责任类型之间发生耦合。(2)抽象责任角色中定义了后继责任角色,并对外提供一个方法供客户端配置。(3)各具体责任类型根据待处理对象的状态结合自己的责任范围来判断是否能处理对象,如果不能处理提交给上级责任人处理(也就是纯的责任模式,要么自己处理要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论