设计模式(二十一)—职责链模式(行为型)
2013-04-27 18:50
204 查看
一、简介(Brief Introduction)
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。二、模式分析(Analysis)
Handler: 抽象处理者:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
ConcreteHandler: 具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
Client: 客户端
三、案例分析(Example)
namespace 职责链模式{
1、客户端
class Program { static void Main(string[] args) { Handler h1 = new ConcreteHander1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach (int request in requests) { h1.HandleRequest(request); } Console.Read(); } }
2、Handler类,定义一个处理请示的接口
abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int request); }3、ConcreteHandler类
class ConcreteHander1 : Handler { public override void HandleRequest(int request) { if (request >= 0 && request < 10) { Console.WriteLine("{0} 处理请求 {1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } class ConcreteHandler2 : Handler { public override void HandleRequest(int request) { if (request >= 10 && request < 20) { Console.WriteLine("{0} 处理请求 {1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } class ConcreteHandler3 : Handler { public override void HandleRequest(int request) { if(request >=20 && request<30) { Console.WriteLine("{0} 处理请求 {1}", this.GetType().Name, request); } else if(successor!=null) { successor .HandleRequest (request ); } } } }
四、解决的问题(What To Solve)
•有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。•在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
•可动态指定一组对象处理请求。
五、优缺点(Advantage and Disadvantage)
优点:• 降低耦合度
• 可简化对象的相互连接
• 增强给对象指派职责的灵活性
• 增加新的请求处理类很方便
缺点
•不能保证请求一定被接收。
•系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。责任链模 式也有缺点,这与if…else…语句的缺点是一样的,那就是在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严 重。
六、扩展(Extend)
职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,
客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。
七、总结(Summary)
责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中,这样做的优点是比较灵活了,但同样也带来了风险, 比如设置处理类前后关系时,一定要特别仔细,搞对处理类前后逻辑的条件判断关系,并且注意不要在链中出现循环引用的问题。相关文章推荐
- 设计模式(二十一)—职责链模式(行为型)
- 设计模式笔记 19. Chain Of Responsibility职责链模式(行为型模式)
- C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
- 行为型:设计模式之迭代器模式(二十一)
- 设计模式笔记(20)---职责链模式(行为型)
- 设计模式(三):行为型模式之职责链模式
- 设计模式笔记(20)---职责链模式(行为型)
- java设计模式(行为型)之职责链模式
- 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)
- 设计模式笔记(20)---职责链模式(行为型)
- C#面向对象模式设计第二十讲:Chain Responsibility 职责链模式(行为型模式)
- 设计模式 ( 二十一 ):Vistor访问者模式 -- 行为型
- 设计模式之行为型模式―― 3.5 职责链模式
- [设计模式笔记]三. 行为型模式--15.Chain Of Responsibility(职责链模式)(一)
- 设计模式(13) 对象行为型模式和职责链模式
- 设计模式之行为型职责链模式
- "围观"设计模式(22)--行为型之职责链模式(Chain Of Responsibility Pattern)
- [设计模式笔记]三. 行为型模式--15.Chain Of Responsibility(职责链模式)(二)
- “设计模式”学习之六:职责链与命令模式(行为型)