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模式就是当外部请求程序进行某个处理,但程序暂时无法直接决定由哪个对象负责处理时,就需要推卸责任.也就是说,当一个人被要求做什么事时,如果他可以做就自己做, ...
随机推荐
- kali 执行apt-get upgrade后,终端无法打开的解决办法
今天在kali执行apt-get upgrade命令后,reboot启动,发现进入界面终端无法开启 一波百度,google发现大概应该是语言的配置问题,因为最开始安装kali的时候是选择中文,可能up ...
- 稀疏编码直方图----一种超越HOG的轮廓特征
该论文是一篇来自CMU 的CVPR2013文章,提出了一种基于稀疏编码的轮廓特征,简称HSC(Histogram of Sparse Code),并在目标检测中全面超越了HOG(Histogram o ...
- uboot启动内核的实现
前面我们分析了uboot 的整个流程,我们知道uboot启动以后所有功能都是通过命令来实现的,启动kernel就是执行了bootcmd里面的命令.命令执行过程在uboot中是非常重要的现在我们就来看u ...
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
- iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET
iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex
- wpf 分别用前台和后台 两种方法 绘制矩形 填充
xaml: <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft ...
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- Linux进程间通信—信号量
二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...
- Nescafé2 月之谜 题解
月之谜 (mystery.pas/c/cpp) [题目描述] 打败了 Lord lsp 之后,由于 lqr 是一个心地善良的女孩子,她想净化 Lord lsp 黑化的心,使他变回到原来那个天然呆的 l ...
- iOS: 详细的正则表达式
一.简单的正则规则 1.由数字.26个英文字母或者下划线组成的字符串: ^[-9a-zA-Z_]{,}$ 2.非负整数(正整数 + 0 ): ^/d+$ 3. 正整数: ^[-]*[-][-]*$ 4 ...