1、职责链模式简介

1.1>、定义

  职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

1.2>、使用频率

   中低

2、职责链模式结构

2.1>、结构图

2.2>、参与者

  职责链模式参与者:

  ◊ Handler

    ° 定义一个处理请求的接口

    ° 实现后继链

  ◊ ConcreteHandler

    ° 处理其所负责的请求

    ° 可访问其后继者

    ° 如果可处理该请求,则处理;否则将该请求转发给它的后继者。

  ◊ Client:向链上的具体处理者对象提交请求

  在职责链模式中,Client向Handler提交请求,请求在多个ConcreteHandler对象形成的对象链中被传递,请求在传递的过程中被处理。

3、职责链模式结构实现

  Handler.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
  7. {
  8. public abstract class Handler
  9. {
  10. protected Handler successor;
  11.  
  12. public void SetSuccessor(Handler successor)
  13. {
  14. this.successor = successor;
  15. }
  16.  
  17. public abstract void HandleRequest(int request);
  18. }
  19. }

  ConcreteHandler1.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
  7. {
  8. public class ConcreteHandler1 : Handler
  9. {
  10. public override void HandleRequest(int request)
  11. {
  12. if (request >= && request < )
  13. {
  14. Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
  15. }
  16.  
  17. else if (successor != null)
  18. {
  19. successor.HandleRequest(request);
  20. }
  21. }
  22. }
  23. }

  ConcreteHandler2.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
  7. {
  8. public class ConcreteHandler2 : Handler
  9. {
  10. public override void HandleRequest(int request)
  11. {
  12. if (request >= && request < )
  13. {
  14. Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
  15. }
  16.  
  17. else if (successor != null)
  18. {
  19. successor.HandleRequest(request);
  20. }
  21. }
  22. }
  23. }

  ConcreteHandler3.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
  7. {
  8. public class ConcreteHandler3 : Handler
  9. {
  10. public override void HandleRequest(int request)
  11. {
  12. if (request >= && request < )
  13. {
  14. Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
  15. }
  16.  
  17. else if (successor != null)
  18. {
  19. successor.HandleRequest(request);
  20. }
  21. }
  22. }
  23. }

  Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using DesignPatterns.ChainOfResponsibilityPattern.Structural;
  7.  
  8. namespace DesignPatterns.ChainOfResponsibilityPattern
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. // Setup Chain of Responsibility
  15. Handler h1 = new ConcreteHandler1();
  16. Handler h2 = new ConcreteHandler2();
  17. Handler h3 = new ConcreteHandler3();
  18.  
  19. h1.SetSuccessor(h2);
  20. h2.SetSuccessor(h3);
  21.  
  22. // Generate and process request
  23. int[] requests = { , , , , , , , };
  24.  
  25. foreach (int request in requests)
  26. {
  27. h1.HandleRequest(request);
  28. }
  29. }
  30. }
  31. }

  运行输出:

  1. ConcreteHandler1 handled request
  2. ConcreteHandler1 handled request
  3. ConcreteHandler2 handled request
  4. ConcreteHandler3 handled request
  5. ConcreteHandler2 handled request
  6. ConcreteHandler1 handled request
  7. ConcreteHandler3 handled request
  8. ConcreteHandler3 handled request
  9. 请按任意键继续. . .

  上例中,ConcreteHandler1负责处理的请求范围0~10,ConcreteHandler2负责处理的请求范围10~20,ConcreteHandler3负责处理的请求范围20~30。当请求ConcreteHandler1处理不了,则让ConcreteHandler2处理,如果ConcreteHandler2处理不了,则让ConcreteHandler3处理。依次类推,Client的请求会验证职责链传递下去,直至请求被处理,而Client不要关心到底是谁处理了请求。

4、职责链模式应用分析

  职责链模式适用情形:

  1>、可能处理请求的对象集合以及它们在链表中的顺序是由Client根据当前应用的状态在运行时动态决定的;

  2>、Client根据状态,对于不同的请求类型,可以拥有不同的可能处理请求的对象集合。一个处理请求的对象也可以根据Client的状态和请求类型,把请求传递给不同的处理对象。

  3>、Client初始化请求,或者在不知道这些对象是否能处理这个请求的情况下初始化任何可能处理请求的对象。Client和在处理链表中的处理对象都不需要知道到底哪个对象去处理这个请求。

  4>、请求不能保证被处理。在没有处理的情况下,请求已经到达了处理链的表尾。

  职责链模式特点:

  1>、职责链模式降低了发出命令的对象和处理命令的对象之间的耦合,它允许多于一个的处理者对象根据自己的逻辑来决定哪个处理者最终处理这个命令。发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。这样在处理命令上,允许系统由更多的灵活性。哪一个对象最终处理一个命令可以由那些对象参加职责链,以及随着这些对象在职责链上的位置不同而不同。

  2>、既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。该请求可能一直到链的末端都得不到处理。一个请求也可以因该链没有被正确配置而得不到响应,并且处理消息传递和处理不当会出现消息的循环重复执行。

C#设计模式系列:职责链模式(Chain of Responsibility)的更多相关文章

  1. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  3. 设计模式之职责链模式(Chain of Responsibility)

    职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...

  4. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  5. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  6. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  7. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  8. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  9. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  10. 设计模式:职责链模式(Chain of Responsibility)

    去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...

随机推荐

  1. hive 创建三种文件类型的表

    --TextFile set hive.exec.compress.output=true; set mapred.output.compress=true; set mapred.output.co ...

  2. phpcms文章点击量统计方法

    phpcms用户广大,很好用,很傻瓜.设计思路也很好,对cms的常见功能都有设计,可以作为自己开发的参考. 最近看了下phpcms的源码关于文章点击量统计的这块,自己记录下. 默认文章点击量显示的位置 ...

  3. acm入门 杭电1001题 有关溢出的考虑

    最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...

  4. Curator leader 选举(一)

    要想使用Leader选举功能,需要添加recipes包,可以在maven中添加如下依赖: <dependency> <groupId>org.apache.curator< ...

  5. jquery 获取奇数索引的元素

    $(".btn-xs:odd").click(function(){ var $buy_num=$(this).prev("#buy_num").val(); ...

  6. sql with as union all

    WITH RPL (FId,Fname,Forder) AS ( SELECT ment.deptno,ment.deptname,ment.orderno FROM JTERP..fg_depart ...

  7. Ubuntu 14.04(amd64)安装Oracle11g XE(x64)

    下载Oracle安装包 下载地址:Oracle Database Express Edition 11g Release 2 for Linux x64 安装办法 1、建立oracle用户及属主 ad ...

  8. android studio/Intellij idea之proguard实践

    默认情况下,build->Gene Signed APK 反编译后发现,没有混淆... 多次爬stackoverflow才搞定这个问题: 首先 build variants这里由debug设置为 ...

  9. JavaScript 作用域知识点梳理

    JavaScript的作用域一直以来是前端开发中难以理解的知识点,对于JavaScript的作用域主要记住几句话. 一.“JavaScript” 中无块级作用域 在   Java 或 C# 中存在块级 ...

  10. *HDU1847 博弈

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...