C++设计模式实现--职责链(Chain of Responsibility)模式
一. 概述
职责链模式:
使多个对象都有机会处理请求。从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
二. 举个样例
员工要求加薪
公司的管理者一共同拥有三级:总经理、总监、经理,假设一个员工要求加薪,应该向主管的经理申请。假设加薪的数量在经理的职权内。那么经理能够直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理能够处理全部请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
结构图例如以下:

如果:
经理能够处理薪水的范围在:0~500
总监能够处理薪水的范围在:500~1000
总经理能够处理薪水的范围在:1000~2000
则代码例如以下:
- //////////////////////////////////////////////////////////////////////////
- //抽象处理类
- class Handle
- {
- public:
- virtual ~Handle()
- {
- delete _succ;
- }
- virtual void HandleRequest(int request) = 0;
- //设置其上级
- void SetSuccessor(Handle* succ)
- {
- _succ = succ;
- }
- Handle* GetSuccessor()
- {
- return _succ;
- }
- protected:
- Handle()
- {
- _succ = NULL;
- }
- private:
- Handle* _succ;
- };
- //详细处理类 A
- class ConcreteHandleA: public Handle
- {
- public:
- void HandleRequest(int request)
- {
- if (request >= 0 && request < 500)
- {
- cout << "ConcreteHandleA deal with: " << request <<endl;
- }
- else if (this->GetSuccessor() != NULL)
- {
- this->GetSuccessor()->HandleRequest(request);
- }
- else
- {
- cout << "Can't deal with " << request << endl;
- }
- }
- };
- //详细处理类 B
- class ConcreteHandleB: public Handle
- {
- public:
- void HandleRequest(int request)
- {
- if (request >= 500 && request < 1000)
- {
- cout << "ConcreteHandleB deal with: " << request <<endl;
- }
- else if (this->GetSuccessor() != NULL)
- {
- this->GetSuccessor()->HandleRequest(request);
- }
- else
- {
- cout << "Can't deal with " << request << endl;
- }
- }
- };
- //详细处理类 C
- class ConcreteHandleC: public Handle
- {
- public:
- void HandleRequest(int request)
- {
- if (request >= 1000 && request < 2000)
- {
- cout << "ConcreteHandleC deal with: " << request <<endl;
- }
- else if (this->GetSuccessor() != NULL)
- {
- this->GetSuccessor()->HandleRequest(request);
- }
- else
- {
- cout << "Can't deal with " << request << endl;
- }
- }
- };
- //////////////////////////////////////////////////////////////////////////
- //測试
- int main()
- {
- Handle* h1 = new ConcreteHandleA();
- Handle* h2 = new ConcreteHandleB();
- Handle* h3 = new ConcreteHandleC();
- //设置其上级
- h1->SetSuccessor(h2);
- h2->SetSuccessor(h3);
- h1->HandleRequest(300);
- h1->HandleRequest(600);
- h1->HandleRequest(1500);
- h1->HandleRequest(3000);
- delete h1;
- delete h2;
- delete h3;
- return 0;
- }
三. 说明
1. 职责链的特点是:当客户提交一个请求时。请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
2. 职责链的优点是:请求者不用管哪个对象来处理,反正该请求会被处理。
它仅仅需保持一个后继者就可以。
3. 要注意的是:一个请求到链的最后可能也没有处理。所以一定要配置得当。
C++设计模式实现--职责链(Chain of Responsibility)模式的更多相关文章
- 设计模式C++描述----05.职责链(Chain of Responsibility)模式
一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 ...
- 职责链(Chain of Responsibility)模式在航空货运中的运用实例
设计模式这东西,基本上属于“看懂一瞬间,用会好几年”.只有实际开发中,当某一模式很好的满足了业务需求时,才会有真切的感觉.借用一句<闪电侠>中,绿箭侠教导闪电侠的台词:“不是你碰巧遇到了它 ...
- atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式(十三) 职责链(chain of responsibility)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
- 设计模式之美:Chain of Responsibility(职责链)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- 设计模式-利用职责链模式消除if
本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...
- 设计模式(十四)Chain of Responsibility模式
Chain of Responsibility模式就是当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任.也就是说,当一个人被要求做什么事时,如果他可以做就自己做, ...
随机推荐
- 三、python的数据类型 列表、元组、字典
1.list 列表 列表是由一序列特定顺序排列的元素组成的.可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系.列表也是自带下标的,默认也还是从0开始. List常用的 ...
- HP-unix如何生成动态库?
HP-unix系统生成动态库编译的方法? 创建PIC中间文件的编译器选项是+z,创建动态库的链接器标志是-b. 1. cc +z d1.c d2.c /* 编译以".o"为扩展名的 ...
- Cocos2d-x3.0 解压zip
2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...
- MatLab角点检測(harris经典程序)
http://blog.csdn.net/makenothing/article/details/12884331 这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的 ...
- Get just enough boost voltage - current-mirror circuit - VOUT tracks VIN varies
Adding a current-mirror circuit to a typical boost circuit allows you to select the amount of boost ...
- J-LINK序列号修改
打开J-LINK COMMANDER中输入 exec setsn=xxxxxxxx 即可
- 如何删除Struts2动作的后缀扩展名
在Struts2中,所有动作类有一个默认的后缀 .action 扩展. 例如, <struts> <package name="default" namespac ...
- react+redux+generation-modation脚手架搭建一个todolist
TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...
- Memcached源码分析——连接状态变化分析(drive_machine)
这篇文章主要介绍Memcached中,基于libevent构造的主线程和worker线程所处理连接的状态互相转换的过程(不涉数据的存取等操作),也就是drive_machine的主要业务逻辑了.状态转 ...
- AE 打开工具箱工具的对话框
The best approach to run a system tool—or any tool or model created, and saved in a toolbox from a b ...