您的位置:首页 > 大数据 > 人工智能

设计模式学习笔记--Chain Of Responsibility 职责链模式

2009-10-13 09:54 609 查看
职责链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

引入职责链模式的目的仍然是为了解除耦合,从“封装变化”的角度出发,它封装了“职责行为的变化”,同时又利用链结构保证了消息的传递,此模式的优势在于它能够“智能”地根据条件在职责链中定位到合适的对象,并执行其职能。

职责链模式的UML图如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace MyChainResponsibility

3、客户端应用

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace MyChainResponsibility

3、客户端应用

Receipt发票类定义

.");

Receipt r2 = new Receipt(760, "处室活动开销.");

Receipt r3 = new Receipt(360, "采购办公用品.");

//设置责任链

ke.SetSuccessor(chu);

chu.SetSuccessor(ju);

//责任处理

ke.HandleRequest(r1);

ke.HandleRequest(r2);

ke.HandleRequest(r3);

Console.ReadKey();

#endregion

总结 [/b]

1、何时采用

从代码角度来说,如果一个逻辑的处理由不同责任对象完成,客户端希望能自定义这个处理流程并且不希望直接和多个责任对象发生耦合的时候可以考虑责任链模式。

从应用角度来说,如果对一个事情的处理存在一个流程,需要经历不同的责任点进行处理,并且这个流程比较复杂或只希望对外公开一个流程的入口点的话可以考虑责任链模式。其实,责任链模式还可以在构架的层次进行应用,比如.NET中的层次异常处理关系就可以看作是一种责任链模式。

2、实现要点

(1)有一个抽象责任角色,避免各责任类型之间发生耦合。

(2)抽象责任角色中定义了后继责任角色,并对外提供一个方法供客户端配置。

(3)各具体责任类型根据待处理对象的状态结合自己的责任范围来判断是否能处理对象,如果不能处理提交给上级责任人处理(也就是纯的责任模式,要么自己处理要么提交给别人)。当然,也可以在进行部分处理后再提交给上级处理(也就是不纯的责任链模式)。

(4)需要在客户端链接各个责任对象,如果链接的不恰当,可能会导致部分对象不能被任何一个责任对象进行处理。

3、注意事项

责任链模式和状态模式的区别在于,前者注重责任的传递,并且责任链由客户端进行配置,后者注重对象状态的转换,这个转换过程对客户端是透明的。

前往:设计模式学习笔记清单
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐