动机(Motivate):
    在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。
    如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。
意图(Intent):
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图(Struct):
             

适用性:
    1.有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    2.你想在不明确接收者的情况下,向多个对象中的一个提交一个请求。
    3.可处理一个请求的对象集合应被动态指定。
生活中的例子:
               

代码实现:
          

1     //Handler
 2    abstract class Approver
 3     {
 4        protected Approver successor;
 5        public void SetSuccessor(Approver successor)
 6        {
 7            this.successor = successor;
 8        }
 9        public abstract void ProcessRequest(Purchase purchase);
10 
11     }
12 
13 
14

1     //ConcreteHandler
 2     class Director :Approver
 3     {
 4         public override void ProcessRequest(Purchase purchase)
 5         {
 6             if (purchase.Amount < 10000.0)
 7             {
 8                 Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number);
 9 
10             }
11             else if(successor !=null)
12             {
13                 successor.ProcessRequest(purchase);
14             }
15         }
16     }


 2 
 3 
 4     class VicePresident :Approver
 5     {
 6         public override void ProcessRequest(Purchase purchase)
 7         {
 8             if (purchase.Amount < 25000.0)
 9             {
10                 Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number);
11 
12             }
13             else if (successor != null)
14             {
15                 successor.ProcessRequest(purchase);
16             }
17         }
18     }


 2     class President :Approver
 3     {
 4         public override void ProcessRequest(Purchase purchase)
 5         {
 6             if (purchase.Amount < 100000.0)
 7             {
 8                 Console.WriteLine("{0} approved request# {1}", this.GetType().Name, purchase.Number);
 9 
10             }
11             else
12             {
13                 Console.WriteLine("Request! {0} requires an executive meeting!", purchase.Number);
14             }
15         }
16     }


 2 
 3     //Request details
 4     class Purchase
 5     {
 6         private int number;
 7         private double amount;
 8         private string purpose;
 9 
10         //Constructor
11         public Purchase(int number, double amount, string purpose)
12         {
13             this.number = number;
14             this.amount = amount;
15             this.purpose = purpose;
16         }
17         //Properties
18         public double Amount
19         {
20             get { return amount; }
21             set { amount = value; }
22         }
23         public string Purpose
24         {
25             get { return purpose; }
26             set { purpose = value; }
27         }
28         public int Number
29         {
30             get { return number; }
31             set { number = value; }
32         }
33     }

客户端调用如下:


 2     class Program
 3     {
 4         static void Main(string[] args)
 5         {
 6             //Setup Chain of Responsibility
 7             Director Larry = new Director();
 8             VicePresident Sam = new VicePresident();
 9             President Tammy = new President();
10             Larry.SetSuccessor(Sam);
11             Sam.SetSuccessor(Tammy);
12 
13             //Generate and process purchase requests
14             Purchase p = new Purchase(1034, 350.00, "Supplies");
15             Larry.ProcessRequest(p);
16 
17             p = new Purchase(2035, 32590.10, "Project X");
18             Larry.ProcessRequest(p);
19 
20             p = new Purchase(2036, 122100.00, "Project Y");
21             Larry.ProcessRequest(p);
22 
23             //Wait for user
24             Console.Read();
25         }
26     }

运行结果如下:
               

Chain of Responsibility实现要点:
    1.Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只胡一个”,只有这时候请求发送者与接受者的耦合才胡可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。
    2.应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
    3.如果请求传递到职责链的未尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。

37职责链模式(Chain of Responsibility Pattern)相关推荐

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

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

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

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

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

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

  4. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求, ...

  5. 设计模式的理解: 职责链模式 (Chain of Responsibility)

    职责链模式(Chain of Responsibility Pattern),为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

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

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

  7. 职责链模式(chain of responsibility)

    原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不 ...

  8. 重温设计模式(三)——职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  9. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

最新文章

  1. 脑外伤急救后迟发性颅脑损伤影响因素分析案例
  2. cent os 6 fdisk fat32
  3. 谈几个初学者混淆不清的问题
  4. elasticearch 多种查询参数用法:
  5. Python 路径问题:cv2.error: OpenCV(4.1.0)...size.width>0 size.height>0 in function ‘cv::imshow‘. 解决方法
  6. Sublime Text 3 中文乱码的解决方法
  7. Action Framework- Table PPFSFMLRU
  8. html vba 单元格 格式,VBA设置单元格格式之——字体
  9. 由friend用法引出的声明与定义那些事儿
  10. 对计算机网络教程的计划,计算机网络技术与应教程教学计划14.doc
  11. 这世上有个词叫Crush,有多少人误把它当做Love
  12. 安装nginx之前的组件
  13. Power Apps 中显示 SharePoint Online 数据
  14. 思岚A1M8激光雷达-ubuntu18.04-slam建图参考
  15. 计算机无法识别银行usb是,电脑不能识别USB设备(加密设备、网银U盾等)的解决方法...
  16. 单片机 74HC573
  17. 《软件测试的艺术》读书笔记(一)
  18. halcon学习_超人启蒙班10-20课
  19. Unity 讯飞实时语音转写(二)—— 接收转写结果
  20. 宇视科技实习生笔试面试经历

热门文章

  1. Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)
  2. asp.net读取xml方法
  3. 基于visual Studio2013解决面试题之0702输出数字
  4. 解决Android中的ERROR: the user data image is used by another emulator. aborting的方法
  5. container_of深入理解
  6. 847. Shortest Path Visiting All Nodes(二)
  7. [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]
  8. [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
  9. The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp
  10. linux虚拟服务器新增磁盘怎么挂载,如何在vmware虚拟机Linux中增加硬盘的方法(教程)...