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

设计模式(C++)-行为型模式-责任链模式

设计模式(C++)-行为型模式-责任链模式

一、责任链模式概述

责任链模式(Chain of Responsibility Pattern):是一种行为型设计模式,允许你将请求沿着处理者链进行发送。每个处理者都可以决定是否处理请求以及是否将请求传递给链中的下一个处理者。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。

二、责任链模式UML类图

责任链场景

编写程序完成学校OA系统的采购审批项目:需求:

  • 采购员采购教学器材
  • 如果金额 小于等于5000, 由教学主任审批
  • 如果金额 小于等于10000, 由院长审批
  • 如果金额 小于等于30000, 由副校长审批
  • 如果金额 超过30000以上,有校长审批

三、代码实现

//chain.h#pragmaonce/* 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。 这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同 的请求传给下一个接收者,依此类推 **主要解决:**职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求 的发送者和请求的处理者解耦了。 **何时使用:**在处理消息的时候以过滤很多道。 举例: 编写程序完成学校OA系统的采购审批项目:需求: - 采购员采购教学器材 - 如果金额 小于等于5000, 由教学主任审批 - 如果金额 小于等于10000, 由院长审批 - 如果金额 小于等于30000, 由副校长审批 - 如果金额 超过30000以上,有校长审批 */#include<iostream>#include<string>#include<memory>usingnamespacestd;//购买请求类classPurchaseRequest{public:PurchaseRequest(constinttype,constfloatprice,constintid):type(type),price(price),id(id){}intgetType()const;floatgetPrice()const;intgetId()const;private://请求类型inttype;//价格floatprice=0.f;intid=0;};//审批类classApprover{public:explicitApprover(conststring&name):m_name(name){};voidsetApprover(Approver*constapprover);//处理审批请求的方法,得到一个请求,处理是子类完成的,因此该方法写成纯虚方法virtualvoidprocessRequest(PurchaseRequest*purchaseRequest)=0;protected://下一个处理者Approver*nextApprover;string m_name;};//教学主任classDepartmentApprover:publicApprover{public:explicitDepartmentApprover(conststring&name):Approver(name){}voidprocessRequest(PurchaseRequest*purchaseRequest)override;};//院长classCollegeApprover:publicApprover{public:explicitCollegeApprover(conststring&name):Approver(name){}voidprocessRequest(PurchaseRequest*purchaseRequest)override;};//副校长classViceSchoolMasterApprover:publicApprover{public:explicitViceSchoolMasterApprover(conststring&name):Approver(name){}voidprocessRequest(PurchaseRequest*purchaseRequest)override;};//校长classSchoolMasterApprover:publicApprover{public:explicitSchoolMasterApprover(conststring&name):Approver(name){}voidprocessRequest(PurchaseRequest*purchaseRequest)override;};voidtestChainOfResponsibility();//chain.cc#include"chain.h"intPurchaseRequest::getType()const{returntype;}floatPurchaseRequest::getPrice()const{returnprice;}intPurchaseRequest::getId()const{returnid;}voidApprover::setApprover(Approver*constapprover){this->nextApprover=approver;}voidDepartmentApprover::processRequest(PurchaseRequest*purchaseRequest){if(purchaseRequest->getPrice()<=5000){cout<<"请求编号id="<<purchaseRequest->getId()<<"被"<<this->m_name<<"处理"<<endl;}else{nextApprover->processRequest(purchaseRequest);}}voidCollegeApprover::processRequest(PurchaseRequest*purchaseRequest){if(purchaseRequest->getPrice()>5000&&purchaseRequest->getPrice()<=10000){cout<<"请求编号id="<<purchaseRequest->getId()<<"被"<<this->m_name<<"处理"<<endl;}else{nextApprover->processRequest(purchaseRequest);}}voidViceSchoolMasterApprover::processRequest(PurchaseRequest*purchaseRequest){if(purchaseRequest->getPrice()>10000&&purchaseRequest->getPrice()<=30000){cout<<"请求编号id="<<purchaseRequest->getId()<<"被"<<this->m_name<<"处理"<<endl;}else{nextApprover->processRequest(purchaseRequest);}}voidSchoolMasterApprover::processRequest(PurchaseRequest*purchaseRequest){if(purchaseRequest->getPrice()>30000){cout<<"请求编号id="<<purchaseRequest->getId()<<"被"<<this->m_name<<"处理"<<endl;}else{nextApprover->processRequest(purchaseRequest);}}voidtestChainOfResponsibility(){cout<<"=================chain of responsibility begin==============="<<endl;//创建一个请求std::unique_ptr<PurchaseRequest>purchaseRequest=std::make_unique<PurchaseRequest>(1,1000,1);std::unique_ptr<PurchaseRequest>purchaseRequest1=std::make_unique<PurchaseRequest>(1,30000,2);//创建相关的审批人std::unique_ptr<DepartmentApprover>department=std::make_unique<DepartmentApprover>("张主任");std::unique_ptr<CollegeApprover>college=std::make_unique<CollegeApprover>("李院长");std::unique_ptr<ViceSchoolMasterApprover>viceSchoolMaster=std::make_unique<ViceSchoolMasterApprover>("王副校长");std::unique_ptr<SchoolMasterApprover>schoolMaster=std::make_unique<SchoolMasterApprover>("佟校长");//需要将各个审批级别的下一个人设置好(处理人构成一个环装就可以从任何一个人开始处理了)//否则必须从第一个处理人开始department->setApprover(college.get());college->setApprover(viceSchoolMaster.get());viceSchoolMaster->setApprover(schoolMaster.get());schoolMaster->setApprover(department.get());//开始处理请求viceSchoolMaster->processRequest(purchaseRequest.get());department->processRequest(purchaseRequest1.get());cout<<"=================chain of responsibility end==============="<<endl;}

四、优缺点总结:

优点:

  • 降低耦合度:请求发送者无需知道具体处理者
  • 增强灵活性:可以动态添加或修改处理链
  • 简化对象:每个处理者只需关注自己的处理逻辑
  • 支持开闭原则:新增处理者无需修改现有代码

缺点:

  • 请求可能不被处理:如果链中没有合适的处理者
  • 性能影响:长处理链可能影响性能
  • 调试困难:请求的处理流程不够明确
  • 可能产生循环引用:需要注意智能指针的使用
http://www.jsqmd.com/news/720690/

相关文章:

  • 保姆级教程:用Sentinel-1数据做InSAR监测,从干涉图到形变图(附Python代码)
  • 手把手教你用Flutter 3.0构建一个高仿抖音APP
  • .NET程序到底是如何被执行的?
  • 2026年万级洁净生产车间厂家品牌推荐榜/高度自动化生产线 - 品牌策略师
  • 终极指南:PoeCharm - 流放之路中文版BD构建神器,让角色规划精准高效
  • CoDiQ框架:智能生成难度可控测试题的技术解析
  • 别再手动挪数据了!C++ STL list的splice方法,3分钟搞定链表拼接与元素移动
  • 2026年南通驾校机构口碑推荐榜:学车报名、驾考培训、驾驶员培训、考驾照、驾驶证培训机构选择指南 - 海棠依旧大
  • 【2026年版|必收藏】AI核心体系拆解:从基础层到应用层,小白也能看懂的大模型入门指南
  • 从上海3+6到全国B2B:罗兰艺境GEO完成战略升级 - 罗兰艺境GEO
  • 嵌入式调试利器:用tinyprintf+sprintf打造你的轻量级日志系统
  • Unity游戏自动翻译终极指南:XUnity.AutoTranslator深度解析与实战应用
  • Sub-Agent VS Agent Team:多智能体架构和上下文边界
  • 动态规划算法核心思想与实战技巧详解
  • 2026 年免费图片去背景色的方法有哪些?工具推荐与实测:这个小程序有点东西
  • MCP协议工程实践2026:构建可互操作AI工具生态的完整指南
  • 2026 年驾校厂家口碑推荐榜:驾校,学车报名,驾考培训,驾驶员培训,考驾照,驾驶证培训,C 证驾驶员培训,摩托车驾驶员培训厂家选择指南 - 海棠依旧大
  • EXISTS / NOT EXISTS
  • 别再只盯着FOC了!用STM32的TIMER和普通IO口,手把手教你驱动一个BLDC直流无刷电机
  • TVOC检测仪购买避坑指南:识别优质品牌与厂家 - 品牌推荐大师
  • 3步掌握猫抓Cat-Catch:浏览器资源嗅探的终极效率革命
  • 别急着重装!YOLOv8推理报错‘No module named ultralytics.nn.modules.conv’的三种高效排查与修复姿势
  • 从编译到运行:详解链接脚本中AT、ALIGN命令如何影响你的固件大小与启动速度
  • 基于Git的轻量级秘密管理工具OpenClaw Vault实践指南
  • 如何用DB-GPT打造你的AI数据助手:从自然语言到SQL的终极指南
  • AI Studio深度评测:Visual Studio智能编程伴侣的多模型配置与实战技巧
  • 【2026年版|必收藏】互联网大厂大模型Agent应用算法岗面试经验(小白/程序员速学版)
  • ngx_event_find_timer
  • 全自研悬浮剧场,筑牢文旅项目差异化竞争核心
  • 2026/4/24