一. 概述

职责链模式:

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

二. 举个例子

员工要求加薪

公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批
准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。

结构图如下:

假设:

经理可以处理薪水的范围在:0~500
总监可以处理薪水的范围在:500~1000
总经理可以处理薪水的范围在:1000~2000

则代码如下:

  1. //////////////////////////////////////////////////////////////////////////
  2. //抽象处理类
  3. class Handle
  4. {
  5. public:
  6. virtual ~Handle()
  7. {
  8. delete _succ;
  9. }
  10. virtual void HandleRequest(int request) = 0;
  11. //设置其上级
  12. void SetSuccessor(Handle* succ)
  13. {
  14. _succ = succ;
  15. }
  16. Handle* GetSuccessor()
  17. {
  18. return _succ;
  19. }
  20. protected:
  21. Handle()
  22. {
  23. _succ = NULL;
  24. }
  25. private:
  26. Handle* _succ;
  27. };
  28. //具体处理类 A
  29. class ConcreteHandleA: public Handle
  30. {
  31. public:
  32. void HandleRequest(int request)
  33. {
  34. if (request >= 0 && request < 500)
  35. {
  36. cout << "ConcreteHandleA deal with: " << request <<endl;
  37. }
  38. else if (this->GetSuccessor() != NULL)
  39. {
  40. this->GetSuccessor()->HandleRequest(request);
  41. }
  42. else
  43. {
  44. cout << "Can't deal with " << request << endl;
  45. }
  46. }
  47. };
  48. //具体处理类 B
  49. class ConcreteHandleB: public Handle
  50. {
  51. public:
  52. void HandleRequest(int request)
  53. {
  54. if (request >= 500 && request < 1000)
  55. {
  56. cout << "ConcreteHandleB deal with: " << request <<endl;
  57. }
  58. else if (this->GetSuccessor() != NULL)
  59. {
  60. this->GetSuccessor()->HandleRequest(request);
  61. }
  62. else
  63. {
  64. cout << "Can't deal with " << request << endl;
  65. }
  66. }
  67. };
  68. //具体处理类 C
  69. class ConcreteHandleC: public Handle
  70. {
  71. public:
  72. void HandleRequest(int request)
  73. {
  74. if (request >= 1000 && request < 2000)
  75. {
  76. cout << "ConcreteHandleC deal with: " << request <<endl;
  77. }
  78. else if (this->GetSuccessor() != NULL)
  79. {
  80. this->GetSuccessor()->HandleRequest(request);
  81. }
  82. else
  83. {
  84. cout << "Can't deal with " << request << endl;
  85. }
  86. }
  87. };
  88. //////////////////////////////////////////////////////////////////////////
  89. //测试
  90. int main()
  91. {
  92. Handle* h1 = new ConcreteHandleA();
  93. Handle* h2 = new ConcreteHandleB();
  94. Handle* h3 = new ConcreteHandleC();
  95. //设置其上级
  96. h1->SetSuccessor(h2);
  97. h2->SetSuccessor(h3);
  98. h1->HandleRequest(300);
  99. h1->HandleRequest(600);
  100. h1->HandleRequest(1500);
  101. h1->HandleRequest(3000);
  102. delete h1;
  103. delete h2;
  104. delete h3;
  105. return 0;
  106. }

三. 说明

1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。

3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

设计模式C++描述----05.职责链(Chain of Responsibility)模式的更多相关文章

  1. 职责链(Chain of Responsibility)模式在航空货运中的运用实例

    设计模式这东西,基本上属于“看懂一瞬间,用会好几年”.只有实际开发中,当某一模式很好的满足了业务需求时,才会有真切的感觉.借用一句<闪电侠>中,绿箭侠教导闪电侠的台词:“不是你碰巧遇到了它 ...

  2. 设计模式(十三) 职责链(chain of responsibility)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  3. C++设计模式实现--职责链(Chain of Responsibility)模式

    一. 概述 职责链模式: 使多个对象都有机会处理请求.从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个样例 员工要求加薪 ...

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

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

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

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

  6. C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...

  7. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例子吧,理解起来可能更 ...

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

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

  9. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

随机推荐

  1. scrapy爬取迅雷电影天堂最新电影ed2k

    前言 几天没用scrapy爬网站了,正好最近在刷电影,就想着把自己常用的一个电影分享网站给爬取下来保存到本地mongodb中 项目开始 第一步仍然是创建scrapy项目与spider文件 切换到工作目 ...

  2. Maven 梳理 - 使用Maven构建多模块项目

    多模块实际案例 project |--business (核心业务) |--business-api |--business-service |--business-message |--busine ...

  3. for for in 给已有的li绑定click事件生成新的li也有click事件

    想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...

  4. C/C++中变量的作用域和存储类型简介

    写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...

  5. mybatis 常用的jabcType与javaType对应

    一.jabcType与javaType对应   JDBC Type            Java Type CHAR                 String VARCHAR           ...

  6. Dart数据类型

    变量与常量: 变量: 使用var声明变量,可以赋予不同数据类型的值, 未初始化时默认值是null 使用final声明的变量只能被赋值一次 void main(){ var a; print(a); a ...

  7. yum install php-gd 安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64 大

    yum install php-gd安装php gd库报错Error: php56w-common conflicts with php-common-5.3.3-48.el6_8.x86_64大概的 ...

  8. java核心技术36讲笔记

    Java-Basic 谈谈final. finally. finalize有什么不同? 典型回答: final可以用来修饰类.方法.变量,分别有不同的意义, final修饰的class代表不可以继承扩 ...

  9. 每个新手程序员都必须知道的Python技巧

    当下,Python 比以往的任何时候都更加流行,人们每天都在实践着 Python 是多么的强大且易用. 我从事 Python 编程已经有几年时间了,但是最近6个月才是全职的.下面列举的这些事情,是我最 ...

  10. docker相关概念介绍

    关键词:docker容器与docker镜像 他们之间的关系是docker容器通过docker镜像来创建 docker镜像就是些像ubuntu15.10,ubuntu14.2一样的系统 docker容器 ...