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

一. 概述

职责链模式:

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

二. 举个例子

员工要求加薪

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

结构图如下:

假设:

经理可以处理薪水的范围在:0~500

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

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

则代码如下:

[cpp] view
plain
copy

  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)模式

时间: 2024-12-06 05:26:26

C++设计模式实现--职责链(Chain of Responsibility)模式的相关文章

Java 实现责任链(Chain of Responsibility)模式

类图 /** * 抽象责任 * @author stone * */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleF

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

图解Java设计模式之职责链模式

图解Java设计模式之职责链模式 学校OA系统的采购审批项目 :需求是 传统方案解决OA系统审批,传统的设计方案 职责链模式基本介绍 职责链模式解决OA系统采购审批 职责链模式在SpringMVC框架应用的源码 职责链模式的注意事项和细节 学校OA系统的采购审批项目 :需求是 采购员采购教学器材1)如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000)2)如果金额 小于等于 10000,由院长审批(5000 < x <= 10000)3)如果金额 小于等于 3000

设计模式之职责链模式(JAVA实现)

学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意. 职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理.依次类推 这里将处理对象抽象为Handler类,经理.总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求 类图如下 下面为具体代

Chain of Responsibility模式

消息传递是面向对象开发中经常用到的机制,例如异常的传递,如果当前函数/类无法处理异常,可以将其抛到上一层.消息传递类似,如果一个类收到消息,如果当前类无法处理,可以将消息按照预先定义好的路径传递下去,直到有类可以处理这个消息.这就是Chain of Responsibility模式. Handle类中持有自己的指针/引用,指向某一个派生类.如果当前类无法处理消息,则调用派生类来处理. 实现: Handle.h #ifndef _HANDLE_H_ #define _HANDLE_H_ class

基于.net 职责链来实现 插件模式

插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能从框架中剥离出来 让第三方有机会来扩展程序的功能 思路       公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录.运行程序的时候扫描目   录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来.如下图示   基于.net 职责链来实现 插件模式   

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

结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 1 using System; 2 3 abstract class Handler 4 { 5 protected Handler successorHand

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

一.概述 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.职责链模式是一种对象行为型模式. 核心在于引入一个抽象处理者类 二.适用场景 请求的链式处理,多个对象可以处理同一请求.但是具体由哪个对象来处理由运行时系统根据条件判断确定. 如请假业务场景: 三.UML类图 四.参与者 1.Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了

深入理解JavaScript系列(38):设计模式之职责链模式

介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 也就是说,请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者.提交请求的对象并不明确知道哪一个对象将会处理它——也就是该请求有一个隐式的接受者(implicit receiver).根据运行时刻,任一候选者都可以响应相应的请求,候选者的数目是任意