当前位置: 首页 > news >正文

【设计模式】【行为型模式】【责任链模式】

系列文章目录

可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501


目录

系列文章目录

1 简介

1.1 基本概念

1.2 组成结构

1.3 优点和缺点

2.代码案例

2.1 主要步骤

2.2 代码


1 简介

1.1 基本概念

责任链模式是一种行为型设计模式,它允许你构建一个对象链,让请求从链的一端进入,然后依次沿着链传递处理,直到链上的某个对象能够处理该请求。职责链上的每一个处理者都是一个对象,其内部会包含mNext指向下一个对象,这个对象可以对请求进行处理也可以将请求发送给下一个对象去处理。

1.2 组成结构

1.客户端类:首先其需要创建并组装处理者对象链,即客户端需要通过SetNextHandler函数,将其mNext指向下一个处理者,然后形成一个链表,当客户端发送请求的时候,只需要调用第一个处理者的处理函数即可。
2.抽象的处理者Handler类:这是一个抽象类,主要提供两个接口,第一一个接口是SetNextHandler函数,用于指向下一个处理者,第二个接口是hanlerRequset函数,用于让子类去重写其实现。
2.具体的处理者,Handler类的子类,需要重写hanlerRequset函数。

1.3 优点和缺点

优点:

1.降低耦合度,将请求的发送者和处理者解耦,每个具体的处理者只处理和自己相关的请求,客户端无需知道谁来处理。

2.可扩展性,新增加处理者,也无须修改原有的代码。只继续放在链表中即可。

3.灵活性,可以动态的改变处理者之间的顺序,新增和删除处理者,很方便。

缺点:

1.当链表上的处理者比较多的时候,请求可能需要遍历所有的处理者,可能会存在性能问题。

2.链表建立不当可能草成循环调用,即进入死循环。

3.不一定被处理,如果中间写错,则很可能请求无法到末端。

2.代码案例

2.1 主要步骤

第一步:构建抽象的处理者类(Handler)

第二步:构建多个具体的处理者类,并重写hanlerRequset函数,处理自己类的需求。

第三步:构建链表。

第四步:调用链表头部的hanlerRequset函数。

第三步:

2.2 代码

class Handler //抽象处理类父类
{
public:Handler(std::shared_ptr<Handler> NextHandler){setNextHandler(NextHandler);}void setNextHandler(const std::shared_ptr<Handler> NextHandler)//设置当前处理者的下一个处理者{mNextHandler = NextHandler;}virtual int hanlerRequset(int day) = 0; //纯虚函数,子类需要具体的实现std::shared_ptr<Handler> mNextHandler = nullptr;//指向下一个处理者类
};
0
class GroupLeaderHandler : public Handler //第一个处理者(组长)
{
public:GroupLeaderHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day <= 3 && day >= 0){cout << "GroupLeaderHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};class ManagerHandler : public Handler//第二个处理者(经理)
{
public:ManagerHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day <= 7 && day >= 4){cout << "ManagerHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};class DirectorHandler : public Handler
{
public:DirectorHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler)//第三个处理者(董事长){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day >= 8){cout << "DirectorHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};int main()
{  	auto mspDirectorHandler = make_shared<DirectorHandler>(nullptr);auto mspManagerHandler = make_shared<ManagerHandler>(mspDirectorHandler);auto mspGroupLeaderHandler = make_shared<GroupLeaderHandler>(mspManagerHandler);//构建链表mspGroupLeaderHandler->hanlerRequset(3);//调用统一接口去处理mspGroupLeaderHandler->hanlerRequset(5);mspGroupLeaderHandler->hanlerRequset(8);return 0;
}

相关文章:

  • NAS—网络附加存储
  • mysqldump全备份之后,如何只恢复一个库或者一个表
  • 中画幅巡检相机-SHARE 100M A10
  • Oracle中常用内置函数
  • 如何使用PHP和Selenium快速构建自己的网络爬虫系统
  • mac上使用finder时候,显示隐藏的文件或者文件夹
  • IPython脚本加载秘籍:探索脚本魔法的艺术
  • MySQL 重新初始化实例
  • 【高考志愿】医学
  • Chapter9 更复杂的光照——Shader入门精要学习笔记
  • C盘清理和管理
  • charls抓包工具 mumu模拟器抓包apk
  • Kotlin中的类
  • 真的假不了,假的真不了
  • 动态规划——打家劫舍(C++)
  • [译] 怎样写一个基础的编译器
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 2017年终总结、随想
  • Fabric架构演变之路
  • Git学习与使用心得(1)—— 初始化
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js对象的深浅拷贝
  • Laravel5.4 Queues队列学习
  • Map集合、散列表、红黑树介绍
  • Odoo domain写法及运用
  • PHP的Ev教程三(Periodic watcher)
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • session共享问题解决方案
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 蓝海存储开关机注意事项总结
  • 手机端车牌号码键盘的vue组件
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 正则表达式小结
  • MPAndroidChart 教程:Y轴 YAxis
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #android不同版本废弃api,新api。
  • (7)STL算法之交换赋值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十一)图像的罗伯特梯度锐化
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一) springboot详细介绍
  • (转)项目管理杂谈-我所期望的新人
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Core和.Net Standard直观理解
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net Web项目创建比较不错的参考文章
  • .NET 快速重构概要1
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉