恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
设计模式16-责任链模式:请求的传递与拦截
首页
资讯中心
/
设计模式16-责任链模式:请求的传递与拦截
设计模式16-责任链模式:请求的传递与拦截
发布时间:2026/9/11 18:33:22
责任链模式让请求沿着一条链自己找主人审批流、过滤链、拦截器、异常兜底这些场景都适合把处理者串成一条链谁有资格处理就处理否则传给下一家。一、痛点写死在一处的层层判断报销审批规则经常是这样if(amount1000){return经理审批;}elseif(amount10000){return总监审批;}else{returnCEO 审批;}规则一多判断逻辑会膨胀而且规则可能随时变化比如 1000 到 5000 由经理处理5000 到 20000 由总监处理。每次改规则都要改核心方法。责任链模式的回答把每个处理者封装成独立节点节点自己决定“我能处理吗”不能处理就交给下一个节点。二、实现处理者抽象 → 具体处理者 → 链式组装第一步定义处理者抽象publicabstractclassApprover{protectedApprovernext;publicApproversetNext(Approvernext){this.nextnext;returnnext;}publicfinalStringapprove(longamount){if(canHandle(amount)){returnhandle(amount);}if(nextnull){return无人可以处理;}returnnext.approve(amount);}protectedabstractbooleancanHandle(longamount);protectedabstractStringhandle(longamount);}第二步实现具体处理者publicclassManagerApproverextendsApprover{OverrideprotectedbooleancanHandle(longamount){returnamount1000;}OverrideprotectedStringhandle(longamount){return经理审批通过: amount;}}publicclassDirectorApproverextendsApprover{OverrideprotectedbooleancanHandle(longamount){returnamount10000;}OverrideprotectedStringhandle(longamount){return总监审批通过: amount;}}publicclassCeoApproverextendsApprover{OverrideprotectedbooleancanHandle(longamount){returntrue;}OverrideprotectedStringhandle(longamount){returnCEO 审批通过: amount;}}第三步组装责任链ApprovermanagernewManagerApprover();ApproverdirectornewDirectorApprover();ApproverceonewCeoApprover();manager.setNext(director).setNext(ceo);System.out.println(manager.approve(500));// 经理审批通过System.out.println(manager.approve(5000));// 总监审批通过System.out.println(manager.approve(50000));// CEO 审批通过调用方只把请求交给链头后续由谁处理完全不用关心。三、责任链的核心能力责任链不只能“处理”还能做四件常见的事能力说明拦截当前节点有权拒绝请求不继续传递短路处理后不再传给后续节点传递当前节点处理一部分继续传给下一节点兜底链尾统一处理前面无人处理的情况Servlet Filter、Spring Interceptor、网关过滤器都是责任链思想的成熟实现。四、工程化提醒链的组装要显式避免每个节点自己偷偷持有下一个节点否则链路关系会变得隐晦注意链尾兜底生产上必须处理“无人认领”的情况否则请求会静默丢失链太长时考虑性能与可读性如果处理者只是简单函数可以退化为一个有序列表或函数式ListPredicate。小结责任链模式一句话请求自己找主人主人排成一队。它把多层 if-else 变成可独立维护、可动态组合的处理节点让新增规则不再改动核心分支。