职责链模式:

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

Handler:定义一个处理请示的接口。

ConcreteHandler:具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求者转发给它的后继者。

优点:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构,结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。

随时增加或修改处理一个请求的结构/增强了给对象指派职责的灵活性。

注意:请求可能到了链的末尾都得不到处理,或者因为没有正确配置而得不到处理。

main.cpp

#include <iostream>
#include <stdlib.h>
#include <memory>
#include "Manager.h"
using namespace std;
void process()
{
std::shared_ptr<Manager> ptrCommonManager(new CommonManager("余松"));
std::shared_ptr<Manager> ptrGeneralManager(new GeneralManager("张林"));
//关键,设置职责链
ptrCommonManager->setSuperior(ptrGeneralManager);
Request requestHoliday2("请假",2,"马超请假");
Request requestHoliday3("请假",3,"马超请假");
Request requestAddSalary("加薪",3000,"马超加薪");
ptrCommonManager->requestApplication(requestHoliday2);
ptrCommonManager->requestApplication(requestHoliday3);
ptrCommonManager->requestApplication(requestAddSalary);
}
int main(int argc,char* argv[])
{
process();
system("pause");
getchar();
return 0;
}

Manager.h

#ifndef MANAGER_H
#define MANAGER_H
#include <string>
#include <memory>
typedef struct Request
{
Request(const std::string& sRequestType ,int iNumber , const std::string& sRequestContent )
:_sRequestType(sRequestType),_iNumber(iNumber),_sRequestContent(sRequestContent){}
std::string _sRequestType;//请求类型
int _iNumber;//请求数量
std::string _sRequestContent;//请求内容
}Request;
//管理者
class Manager
{
public:
Manager(const std::string& sName);
virtual ~Manager(void);
void setSuperior(std::shared_ptr<Manager> ptrSuperior);
virtual void requestApplication(const Request& request) = 0;//申请请求
protected:
std::string _sName;
std::shared_ptr<Manager> _ptrSuperior;//上级
};
//经理
class CommonManager : public Manager
{
public:
CommonManager(const std::string& sName);
void requestApplication(const Request& request);
};
//总经理
class GeneralManager : public Manager
{
public:
GeneralManager(const std::string& sName);
void requestApplication(const Request& request);
};
#endif

Manager.cpp

#include "Manager.h"
#include <iostream>
using namespace std;
Manager::Manager(const std::string& sName):_sName(sName)
{
}
Manager::~Manager(void)
{
}
void Manager::setSuperior(std::shared_ptr<Manager> ptrSuperior)
{
_ptrSuperior = ptrSuperior;
}
//经理
CommonManager::CommonManager(const std::string& sName):Manager(sName)
{
}
void CommonManager::requestApplication(const Request& request)
{
//经理所能有的权限就是可以准许下属两天内的假期
if(request._sRequestType == "请假" && request._iNumber <= 2)
{
cout << _sName << ":" << request._sRequestContent << " 数量" << request._iNumber << "被批准" << endl;
}
else
{
if(_ptrSuperior)
{
_ptrSuperior->requestApplication(request);
}
}
}
//总经理
GeneralManager::GeneralManager(const std::string& sName):Manager(sName)
{
}
void GeneralManager::requestApplication(const Request& request)
{
if(request._sRequestType == "请假")
{
cout << _sName << ":" << request._sRequestContent << " 数量" << request._iNumber << "被批准" << endl;
}
else if(request._sRequestType == "加薪" && request._iNumber <= 500)
{
cout << _sName << ":" << request._sRequestContent << " 数量" << request._iNumber << "被批准" << endl;
}
else if(request._sRequestType == "加薪" && request._iNumber > 500)
{
cout << _sName << ":" << request._sRequestContent << " 数量" << request._iNumber << " 再说吧" << endl;
}
}

设计模式:24 加薪非要老总批?_职责链模式相关推荐

  1. 【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式...

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 ...

  2. 【设计模式】加薪非要老总批 --- 职责链模式

    一,概述 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为之. 优点:客户提出请求时,请求时沿链传递直 ...

  3. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  4. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

  5. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例 ...

  6. 第二十章 Caché 设计模式 职责链模式

    文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...

  7. 简说设计模式——职责链模式

    一.什么是职责链模式 从文字角度出发,我们可以先将关注点放在"链"字上,很容易联想到链式结构,举个生活中常见的例子,击鼓传花游戏就是一个很典型的链式结构,所有人形成一条链,相互传递 ...

  8. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  9. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

最新文章

  1. PHPUnit实践三(构建模块化的测试单元)
  2. 精益创新之设计思维研磨——《设计改变一切》书评
  3. 毒霸duba劫持首页的解决方案(实测有效)
  4. 关于Tomcat安装过程中出现的一些问题...
  5. json_encode 中文乱码
  6. linux下用js生成xml文件,使用JS读取XML文件的方法
  7. docker自动化部署
  8. Spring与日志的整合
  9. 1.7 编程基础之字符串 14 大小写字母互换 python
  10. Python类中的私有属性和私有方法
  11. 同一个SQL语句,为啥性能差异咋就这么大呢?
  12. 埃尔米特(Hermite)插值及其MATLAB程序
  13. LINUX上安装gstreamer,解决video.h找不到的错误
  14. Github上十大C#开源项目排行榜
  15. Fortran95学习笔记
  16. Git(码云)如何把本地仓库提交到远程仓库
  17. 创业能力之市场细分:小明的保时捷4S店的故事
  18. qlabel 添加图标_Qt之添加图标
  19. python做人脸识别速度_Python人脸识别速度慢
  20. pycharm调试模式

热门文章

  1. 论文阅读-The Log-Structured Merge-Tree (LSM-Tree)
  2. 阿里云服务器CentOS的特定端口
  3. 在使用HQL语句进行查询时,出现node to traverse cannot be null!错误
  4. 统计出现的次数matlab,使用MATLAB统计数列中数字出现的次数
  5. python代码雨屏保_python写的屏保程序
  6. android仿iphone页面,Android仿苹果关机界面实现代码
  7. 【AE】通过Element3D制作科技感物体动画
  8. java OA办公自动化系统毕业设计
  9. 运动健康者的福音,拍照即可获取食物卡路里和营养元素啦
  10. 关于360DOC(个人图书馆)不能复制的解决办法_bin910729_新浪博客