一. 概述

职责链模式:

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

二. 举个样例

员工要求加薪

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

结构图例如以下:

如果:

经理能够处理薪水的范围在: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++设计模式实现--职责链(Chain of Responsibility)模式的更多相关文章

  1. 设计模式C++描述----05.职责链(Chain of Responsibility)模式

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

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

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

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

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

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

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

  5. 设计模式之美:Chain of Responsibility(职责链)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...

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

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

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

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

  8. 设计模式-利用职责链模式消除if

    本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...

  9. 设计模式(十四)Chain of Responsibility模式

    Chain of Responsibility模式就是当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任.也就是说,当一个人被要求做什么事时,如果他可以做就自己做, ...

随机推荐

  1. Apache -- 利用.htaccess防盗链

    在Apache服务器的前提下利用.htaccess文件来防盗链的原理是通过检查图片或文件请求头信息中的Referer属性(也就是请求的来源),判断它是否属于你所规定的合法的请求来源,从而实现让合法来源 ...

  2. kali 执行apt-get upgrade后,终端无法打开的解决办法

    今天在kali执行apt-get upgrade命令后,reboot启动,发现进入界面终端无法开启 一波百度,google发现大概应该是语言的配置问题,因为最开始安装kali的时候是选择中文,可能up ...

  3. HP-unix如何生成动态库?

    HP-unix系统生成动态库编译的方法? 创建PIC中间文件的编译器选项是+z,创建动态库的链接器标志是-b. 1. cc +z d1.c d2.c /* 编译以".o"为扩展名的 ...

  4. obd2 J1962M to DB9

  5. 关闭OOMER

    http://www.cnblogs.com/itfriend/archive/2011/12/14/2287160.html http://blog.csdn.net/gugemichael/art ...

  6. 单击行,自己主动选中当前行中的单选框button

    需求:单击行,自己主动选中当前行中的单选框button. aspx页面: <asp:Repeater ID="rptRecordList" runat="serve ...

  7. 《Haskell趣学指南》

    <Haskell趣学指南> 基本信息 原书名:Learn You a Haskell for Great Good!: A Beginner's Guide 原出版社: No Starch ...

  8. Sql server left join,right join和inner join的比较

    转载于:http://www.2cto.com/database/201206/137067.html   Sql server left join,right join和inner join的比较 ...

  9. [转发] git设置代理

    一. 写的很好推荐,(http与ssh设置都有) https://imciel.com/2016/06/28/git-proxy/ 二. 只有 http的方式代码设置 http://stackover ...

  10. Linux统计/监控工具SAR详细介绍

    转载:http://www.ctohome.com/FuWuQi/1b/688.html sysstat 工具简介 sysstat 是 Linux 系统中的常用工具包.它的主要用途是观察服务负载,比如 ...