设计模式-责任链模式
创始人
2025-05-29 03:41:30

责任链模式属于行为模式

Gof定义

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

责任链模式关键点是如何将多个处理节点连成一条链。该模式使一个对象无需知道是其他哪一个对象处理其请求,仅需要知道请求处理的结果。

GOF结构

处理者handler处理它所负责的请求,如果可处理则处理,否则将该请求转发给它的后继者

模式特点

稳定点 多个节点的链式处理流程。

变化点 节点的处理的条件或者处理顺序。

扩展点 动态增删处理节点、调整处理顺序

适用点 一个请求被多个对象处理,并且集合对象应被动态指定。

应用:nginx-处理http流程的11个状态。

场景分析

员工请假流程

1 先向部门主管申请,主管进行处理。

2 部门主管无权限处理时再向他的上级申请比如项目主管,项目主管进行处理。

3 项目主管无权限处理时再向他的上级申请比如区域主管,区域主管进行处理。

4 ...申请依次向下传递,像链条一样,直到有管理者有权限处理为止。

代码实现

leave.cpp

引入模式后实现

leave_ex.cpp

测试

结论:

1 将请假流程作为一个链表,每个处理者作为处理节点。

2 从单节点出发,实现处理功能以及链表关系,完成传递功能。

3 从实现上看引入模式后代码量增大不少,但是设定了一个稳定点,后续不管是修改每个处理的条件、处理的顺序、以及增删处理都会比较简单,也更加符合设计原则。而原始代码修改这些需要不停的调整以及增删if else判断。

代码示例

leave.cpp

#include 
struct Context{int day;
};class LeaveApply{
public:bool Apply(const Context& ctx){if(!DepartmentManagerProcess(ctx)){if(!ProjectManagerProcess(ctx)){if(!RegionalManagerProcess(ctx)){return false;}}}return true;}private:bool DepartmentManagerProcess(const Context& ctx){if(ctx.day < 3){std::cout << "DepartmentManager agree" << std::endl;  return true;}return false;}bool ProjectManagerProcess(const Context& ctx){if(ctx.day < 10){std::cout << "ProjectManager agree" << std::endl;   return true;}return false;}bool RegionalManagerProcess(const Context& ctx){if(ctx.day < 30){std::cout << "RegionalManager agree" << std::endl;   return true;}return false;}
};int main(int arc,char** arg){std::cout << "leave--" << std::endl;Context ctx;ctx.day = 15;if(arc == 2){ctx.day = std::stoi(arg[1]);}LeaveApply la;if(la.Apply(ctx)){std::cout <<  ctx.day << " days off success" << std::endl;}else{std::cout <<  ctx.day << " days off failed" << std::endl;}return 0;
}

leave_ex.cpp


#include 
struct Context{int day;
};class Manager{
public:virtual bool Process(const Context& ctx) = 0;Manager* get_next(){return next_;}void set_next(Manager* manager){next_ = manager;}private:Manager* next_ = nullptr;
};class DepartmentManager : public Manager{
public:    virtual bool Process(const Context& ctx){if(ctx.day < 3){std::cout << "DepartmentManager agree" << std::endl; return true;}return false;}
};class ProjectManager : public Manager{
public:    virtual bool Process(const Context& ctx){if(ctx.day < 10){std::cout << "ProjectManager agree" << std::endl;return true;}return false;}
};class RegionalManager : public Manager{
public:    virtual bool Process(const Context& ctx){if(ctx.day < 30){std::cout << "RegionalManager agree" << std::endl;return true;}return false;}
};class LeaveApply{
public:LeaveApply(){ManageResponsibility();}~LeaveApply(){while(manager_){auto ptr = manager_;manager_ = manager_->get_next();delete ptr;ptr = nullptr;}}bool Apply(const Context& ctx){if(!manager_){return false;}Manager* cur = manager_;while(cur){if(cur->Process(ctx)){return true; }else{cur = cur->get_next();}}return false;}private:void ManageResponsibility(){Manager* dm = new DepartmentManager();Manager* pm = new ProjectManager();Manager* rm = new RegionalManager();dm->set_next(pm);pm->set_next(rm);manager_ = dm;}Manager* manager_ = nullptr;
};int main(int arc,char** arg){std::cout << "leave2--" << std::endl;Context ctx;ctx.day = 15;if(arc == 2){ctx.day = std::stoi(arg[1]);}LeaveApply la;if(la.Apply(ctx)){std::cout <<  ctx.day << " days off success" << std::endl;}else{std::cout <<  ctx.day << " days off failed" << std::endl;}return 0;
};

相关内容

热门资讯

SpringBoot的单例模式... 目录 Spring使用的设计模式 单例模式简介 Spring所管理的注解 Spring获取对象时加...
小米总裁:一个能打SU7的对手... 5月27日,小米集团总裁、小米品牌总经理卢伟冰在小米一季度业绩电话会上表示,“SU7发布这么久,一款...
港股创新药ETF(159567... 5月30日,港股医药股走强,石药集团涨近8%,消息面上,石药集团在港交所公告,集团目前正与若干独立第...
2023年“网络安全”赛项江苏... 2023年中职组江苏省淮安市“网络空间安全”赛项 ①.2023年中职组江苏省淮安市任务书②.2023...
ArcGIS: 如何利用模型构... 01 实验数据说明chengdu.pix(栅格图像),其中...
从对标星巴克到沦为 “小透明”... 来源 | 伯虎财经(bohuFN)作者 | 林恩凭借“茶饮+烘焙”的双品类模式与对空间体验的执着追求...
图形视图框架QGraphics... QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphic...
A股三大指数低开 CPO概念跌...   中新经纬5月30日电 30日早间,A股三大指数集体低开,上证指数跌0.14%,报3358.81点...
广东虎门通报小车高架坠桥5人死... 近日,广东东莞环莞快速路虎门段的一起交通事故引发了广泛关注。5月19日,有网友反映其侄儿驾车经过该路...
全球资产再平衡,港股创新药赛道... 近年来,全球资本市场的结构性调整愈发显著。在美联储加息周期临近尾声、地缘博弈常态化背景下,资金正重新...
警惕信创ETF高溢价风险 摘要: 海光信息和中科曙光计划进行资产重组,持有这两只股票权重较高的信创ETF(159537)受到市...
Spring Boot/Clo... 一、前言 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel ...
新思科技:在中国市场销售芯片设... 当地时间5月29日,新思科技称已收到美国商务部工业和安全局 (BIS) 信函,告知新思科技与中国相关...
TIME_WAIT 尽可能客户... 、LISTENING状态   FTP服务启动后首先处于侦听(LISTENING...
蓝桥杯 - 皮亚诺曲线距离 题目描述 皮亚诺曲线是一条平面内的曲线。 下图给出了皮亚诺曲线的 111 阶情形,它是...
卖枕头,真能救酒店? 酒店卖枕... 定焦One(dingjiaoone)原创见习作者 | 何欣欣编辑 | 金玙璠在行业整体规模狂飙突进的...
手写-签名的隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本...
给车机投放广告?深蓝汽车CEO... 文 / 零度来源 / 节点财经5月27日晚间,深蓝汽车在其官方微博账号发文称,“今日,我们关注到部分...
ElasticSearch-第... 目录 ElasticSearch简介 ElasticSearch 应用场景 ElasticSearc...
JAVA练习82-在排序数组中... 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮...
最大值最小值归一化_sklea...  然后我们再来看一下,再来说一下归一化 比如:在公司有两个人,一个是W2 他能力强,然后领导给他分配...
中金公司:微盘风格未来可能仍有... 中金公司研报称,展望未来,微盘风格可能呈现优势边际弱化、仍存在一定结构性机会的格局。政策端对科创小微...
【超详细】MMLab分类任务m... 本文详细介绍了使用MMLab的mmclassification进行分类任务的环境配置、训练与预测流程...
内地优质科技企业“排大队”赴港... 科技企业纷纷涌向港股市场。Wind资讯数据显示,截至5月29日,有5家企业聆讯通过,另有155家企业...
Spring学习(三) Spring的AOP的XML开发(重要指数五颗星*****) 一、AOP...
原创 今... 在1998年房改后,我国房地产市场经历了一次爆发式增长,许多购房者借此机会实现了财富的快速增值,尤其...
原创 A... 5月30日,新股打新市场迎来影石创新的发行申购。它在网上发行656万股,顶格申购需配沪市股票市值6....
15个新一线城市名单出炉,郑州... 【大河财立方 记者 程帅星】5月28日,第一财经旗下新一线城市研究所发布《2025新一线城市魅力排行...
Vector底层源码解析 Java源码系列:下方连接 http://t.csdn.cn/Nwzed 文章目录...
月内3家券商定增迎来新进展,加... 前,证券行业的竞争愈发激烈,资本实力成为券商在市场竞争中制胜的关键因素。近期,证券行业再融资事项迎来...