2026/4/6 11:22:08
网站建设
项目流程
h5制作网站开发,锦州建设信息网站,建筑工程资质合作,刷关键词怎么刷设计模式[13]——责任链模式#xff08;Chain of Responsibility#xff09;一分钟彻底说透#xff08;C版软件领域真实例子#xff09;
一句话定义
将请求沿着一条“链”传递#xff0c;每个处理者决定自己处理或交给下一个#xff0c;避免请求发送者和接收者之间的直接…设计模式[13]——责任链模式Chain of Responsibility一分钟彻底说透C版·软件领域真实例子一句话定义将请求沿着一条“链”传递每个处理者决定自己处理或交给下一个避免请求发送者和接收者之间的直接耦合。最狠的比喻软件人专属HTTP中间件链类似Express/Koa/Drogon请求进来 → 先日志记录 → 再权限校验 → 再限流 → 再CSRF检查 → 最后到业务处理任何一个环节可以直接返回响应拒绝请求或继续往下传客户端完全不知道中间经历了多少层为什么需要它坏味道瞬间爆炸不用责任链你会写出这种if-else地狱if(request.isAdmin()){if(request.rateLimitOk()){if(request.csrfValid()){handleBusiness(request);// 嵌套到吐}}}明天加一个“黑名单检查”所有代码全改寄和装饰器模式到底像不像10秒彻底分清很多人觉得责任链和装饰器长得太像都持有一个next都转发调用但意图和行为完全不同项目装饰器模式Decorator责任链模式Chain of Responsibility核心意图增强功能每层都执行层层叠加职责寻找处理者只有一个或少数处理请求链上每个节点行为必须全部执行日志→压缩→加密 全跑一遍任一节点可终止链认证失败就直接返回执行顺序固定顺序层层包裹先加奶再加糖动态传递直到有人处理可能前几个直接拦截返回结果累积结果价格 基础 奶 糖 摩卡通常一个最终响应成功或拒绝客户端期望得到一个“增强版”对象功能更多得到一个处理结果谁处理无所谓典型例子数据流Logging → Compression → EncryptionWeb中间件Logging → Auth → RateLimit → Business关键代码区别每层调用component-operation()并追加自己的行为每层if (我能处理) { 处理并结束 } else { next }口号“层层叠加全跑一遍”“传下去直到有人接”狠比喻装饰器 给汉堡层层加配料每层配料都必须加最终吃到一个超级汉堡缺一层都不行。责任链 公司请假审批只要有人批了就结束前面的人拒绝就直接完蛋不一定走到老板。真实软件例子Web请求处理链中间件系统#includeiostream#includememory#includestringusingnamespacestd;// 1. 请求上下文structHttpRequest{string user;string path;boolauthenticatedfalse;string body;};// 2. 处理者基类classHandler{protected:unique_ptrHandlernext;public:virtual~Handler()default;voidsetNext(unique_ptrHandlern){nextmove(n);}virtualboolhandle(HttpRequestreq)0;boolhandleNext(HttpRequestreq){if(next)returnnext-handle(req);returnfalse;// 链末尾没人处理}};// 3. 具体处理者classLoggingHandler:publicHandler{public:boolhandle(HttpRequestreq)override{cout[Logging] 请求来自用户: req.user 路径: req.pathendl;returnhandleNext(req);// 日志不拦截继续传}};classAuthHandler:publicHandler{public:boolhandle(HttpRequestreq)override{cout[Auth] 检查认证...\n;if(req.user!admin){cout[Auth] 认证失败拒绝访问\n;returntrue;// 终止链}cout[Auth] 认证通过\n;returnhandleNext(req);}};classRateLimitHandler:publicHandler{public:boolhandle(HttpRequestreq)override{cout[RateLimit] 检查限流...\n;if(req.userguest){cout[RateLimit] 触发限流拒绝\n;returntrue;// 终止}returnhandleNext(req);}};classBusinessHandler:publicHandler{public:boolhandle(HttpRequestreq)override{cout[Business] 处理核心业务逻辑: req.pathendl;cout业务处理完成返回响应\n;returntrue;// 正常结束}};客户端组装链一劳永逸intmain(){autochainmake_uniqueLoggingHandler();chain-setNext(make_uniqueAuthHandler());chain-setNext(make_uniqueRateLimitHandler());chain-setNext(make_uniqueBusinessHandler());// 测试不同请求HttpRequest req1{admin,/api/data};cout 请求1管理员访问 \n;chain-handle(req1);cout\n 请求2普通用户访问 \n;HttpRequest req2{guest,/api/data};chain-handle(req2);cout\n 请求3未认证用户 \n;HttpRequest req3{hacker,/admin};chain-handle(req3);}C 真实项目里无处不在Web框架Drogon/Crow的中间件链GUI事件处理Qt的event filter链日志库多个Appender链式处理审批流程请假 → 部门经理 → HR → 总经理异常处理try-catch链变体终极口诀后端开发者专属“请求沿链往下传谁能处理谁来管耦合彻底解中间件随便加”刻在DNA里的一句话当你有“多个处理者依次处理同一个请求”且处理顺序固定、任一环节可中断时立刻上责任链模式——链式组装解耦到底扩展性拉满现在责任链和装饰器在你脑子里彻底分家了吧下一期命令模式Command[14]准备好了吗