C++之责任链(Chain of Responsibility)模式
0. 简介
对于责任链模式,其作为一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。这种处理方法类似包与包之间的调用的思路,只是其可以不在主程序中累赘的去申明一堆if else变量使得程序更加臃肿。
相比于创建设计模式的对整体架构进行的设计,和结构设计模式对对象的化繁为简的操作,作为行为设计模式,其需要我们对数据流能够充分的把握,来避免检查代码的混乱不堪。 而每次新增功能都会使其更加臃肿。 修改某个检查步骤有时会影响其他的检查步骤。 最糟糕的是, 当你希望复用这些检查步骤来保护其他系统组件时, 你只能复制部分代码, 因为这些组件只需部分而非全部的检查步骤。
1. 责任链模式示意图
职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系。将这些接受处理的对象连成一条链,并沿着该链处理请求。
- BaseHandler:抽象基类,用于作为处理请求的接口。如果特定等级的请求该类无法处理,则传递给下一个handler,一般这类情况class内部都是纯虚函数。
- ConcreteHandler(TechnicalSupportHandler, BillingSupportHandler, and GeneralSupportHandler):处理请求,或将请求传递给handler链中的下一个,这样可以通过设计整个逻辑链避免混乱
- Client(RequestorClient):发起请求,一般是放在主程序中传入
2. 示例程序
在所有的行为模式中,都设计的准则为:使用对象的组合而不是对象的继承。责任链模式所描述的是:与其从已有的类中继承新的类,不如让你的类指向一个你要使用的已经存在的类。责任链模式通过对Handler Object的封装能够有效地管理整条数据流(行为)的走向。从而避免过多的继承嵌套,与数据流的混乱。
#include <iostream>
using namespace std;//抽象处理者
class Handler
{public:Handler() { m_pNextHandler = NULL; }virtual ~Handler() {}//设置下一个处理者void SetNextHandler(Handler *successor) { m_pNextHandler = successor; }//处理请求virtual void HandleRequest(int days) = 0;
protected:Handler *m_pNextHandler; // 后继者
};//具体处理者、主管
class Director :public Handler
{public://处理请求virtual void HandleRequest(int days){if (days <= 1){cout << "我是主管,有权批准一天假,同意了!" << endl; }else{m_pNextHandler->HandleRequest(days);}}
};//具体处理者、经理
class Manager :public Handler
{public://处理请求virtual void HandleRequest(int days){if (days <= 3){cout << "我是经理,有权批准三以下的假,同意了!" << endl;}else{m_pNextHandler->HandleRequest(days);}}
};//具体处理者、老板
class Boss :public Handler
{public://处理请求virtual void HandleRequest(int days){if (days <= 7){cout << "我是老板,最多让你请7天假,同意了!" << endl;}else{cout << "你请的假事假太长了,不同意!" << endl;}}
};//场景
int main()
{Handler *director = new Director;Handler *manager = new Manager;Handler *boss = new Boss;//设置责任链director->SetNextHandler(manager);manager->SetNextHandler(boss);director->HandleRequest(1);director->HandleRequest(2);director->HandleRequest(5);director->HandleRequest(8);return 0;
}
/*结果:
我是主管,有权批准一天假,同意了!
我是经理,有权批准三以下的假,同意了
我是老板,最多让你请7天假,同意了!
你请的假事假太长了,不同意!
请按任意键继续. . .*/
3. 责任链的优缺点
责任链模式、 命令模式、 中介者模式和观察者模式用于处理请求发送者和接收者之间的不同连接方式:
- 责任链按照顺序将请求动态传递给一系列的潜在接收者, 直至其中一名接收者对请求进行处理。
- 命令在发送者和请求者之间建立单向连接。
- 中介者清除了发送者和请求者之间的直接连接, 强制它们通过一个中介对象进行间接沟通。
- 观察者允许接收者动态地订阅或取消接收请求。
责任链和装饰模式的类结构非常相似。 两者都依赖递归组合将需要执行的操作传递给一系列对象。 但是, 两者有几点重要的不同之处。
- 责任链的管理者可以相互独立地执行一切操作, 还可以随时停止传递请求。
- 各种装饰可以在遵循基本接口的情况下扩展对象的行为。
- 装饰无法中断请求的传递。
4. 责任链模式改变之多线程异步
…详情请参照古月居
C++之责任链(Chain of Responsibility)模式相关推荐
- 设计模式学习笔记——责任链(Chain of Responsibility)模式
设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...
- 职责链( Chain of Responsibility)模式
职责链( Chain of Responsibility)模式 职责链模式动机(Motivation) ➢在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指 ...
- 推卸责任的 Chain of Responsibility模式
文章目录 Chain of Responsibility模式 应用场景 本质 优点 缺点 角色 Chain of Responsibility模式的类图 示例程序 示例程序的类图 示例代码 拓展思路 ...
- java使命召唤_Java设计模式之从[使命召唤等游戏的任务提示]分析职责链(Chain Of Responsibility)模式...
我们在使命召唤.暗黑破坏神等游戏时,总会接到各种各样的游戏任务,如到某某地方解救某人,或者消灭某某地方的敌人等.当玩家进入到某一个地图(以下称之为游戏场景)时,我们就可以查看它的任务提示.在这个机制下 ...
- Chain of Responsibility 模式-----推卸责任模式
>> ----- 当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任. 在这种情况下,我们可以考虑将多个对象组成一条职责链,然后按照它们的职责链上的顺序 ...
- 责任链模式(Chain of Responsibility模式)
在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的 ...
- 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式
1创建型的设计模式-主要有单例模式和工厂模式 对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题 2结构型的设计模式-主要有代理模式和适配 ...
- 行为模式之Chain of Responsibility模式
1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2.适用性 在以下条件下使用Responsi ...
- Chain of Responsibility模式——读书笔记
继承如下抽象类的一系列类 abstract class Handler { protected Handler next; Handler(Handler next) { this.next = ne ...
- 从 Forces 开始分析责任链模式:「写一个 Discord 对话机器人」
目录 前言 你收到了一份需求 面向对象分析 (OOA) 初版程式实作 察觉 Forces 套用责任链模式 (OOD) 封装变动之处 (Encapsulate what varies) 萃取共同行为 ( ...
最新文章
- 运行返回签名不正确_不正确运行废气治理RTO设备容易引起爆炸,注意事项有哪些?...
- 搭建git for windows服务器(100%可以成功)【转】
- 纯正价格正则表达式,请指正
- 项目: 用数组实现反弹球消砖块
- openresty+consul动态配置更新(服务变更发现)
- C 双向链表的简单排序实现
- Spring boot(九):定时任务
- Odoo10参考系列--QWeb报表
- 解析RocketMQ的消息索引文件consumequeue
- Oracle 正则表达式函数-REGEXP_REPLACE 使用例子
- 史记十表-卷十九-惠景间侯者年表第七
- Android 关于佳博和汉印蓝牙热敏打印机开发,androidstudio入门教程
- 浮点数取绝对值的方法
- 清明html模板,HTML5清明节柳叶飘动特效
- spring boot结合FastDFSClient做下载文件注意事项
- (一)制作U盘启动盘
- 数据结构学习笔记(第四章:串)
- SQL13	从titles表获取按照title进行分组
- Python编程:从入门到退学(bushi)第二章
- OpenCV Using Python——应用统计肤色模型和相对于块原点能量的肤色分割