Java设计模式之责任链

责任链模式的核心思想特别像快递分拣流程。比如一个包裹从收货站出发,先经过市级中心判断是否本地件,再流转到省级中心检查是否加急,最后才决定发往全国枢纽。每个环节只关心自己能否处理,不行就甩给下一站,全程不用总控中心操心。对应到代码里,就是把多个处理对象串成一条链,请求像击鼓传花一样挨个路过它们,谁合适谁接手。

先看模式的结构。最核心的是抽象处理器(Handler),它定义两个东西:一个处理请求的方法,比如,还有一个指向下一个处理器的引用。具体处理器(ConcreteHandler)继承这个抽象类,实现自己的业务逻辑。如果当前处理器搞不定,就调用后继者的方法把请求传下去。最后是客户端(Client),它负责把珠子穿成链,并把请求丢到链头。

这模式最大的好处是解耦。比如要做日志系统,咱们可以把Debug、Info、Error三个处理器串起来。Debug只管输出调试信息,Info记录常规操作,Error专抓异常。哪天想加个Warn级别?直接插个新处理器进链里,旧代码毫发无伤。再比如审批流程,组长批完转经理,经理批完转总监,每个节点只需关注自己的审批阈值。

不过它也有坑。万一链太长,请求得像逛迷宫似的绕半天,性能肯定受影响。更头疼的是容易丢包------要是某个处理器忘了调用后继者,请求就半路失踪了。所以用的时候得记得在链尾放个兜底处理器,像垃圾分类里的"其他垃圾"桶,专收没人要的请求。

下面用代码模拟费用报销审批场景。假设基层员工只能批500元以内,经理能批2000元,再往上就得找总监。先定义抽象处理器:

具体处理器继承这个基类,实现不同级别的审批逻辑:

请求对象就是个简单的DTO:

客户端组装责任链并触发请求:

跑起来会发现,300元的单子被员工拦截,1500元的溜到经理那儿,5000元的则一路冲到总监手里。这种设计让审批逻辑分散在各处理器中,哪天要调整金额阈值或增加CFO节点,改起来那叫一个丝滑。

实际项目中,Spring拦截器、Servlet过滤器都是责任链的经典应用。但要注意别滥用,如果处理器之间存在强依赖关系,或者请求必须按固定顺序处理,那还是老老实实用策略模式或模板方法更稳妥。总之,把责任链当成乐高积木,用的好能拼出高扩展性架构,用不好就成了甩锅全家桶。下次遇到多层条件判断时,不妨试试这条链,保准让你直呼真香。

相关推荐
端庄的战斗机1 天前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
饼干哥哥2 天前
我开发了一个「吃掉」别人Skill来升级的饕餮.Skill,现在免费开源
人工智能·设计模式·开源
CaffeinePro2 天前
什么是系统架构?架构师到底在做什么?
设计模式·架构
AI人工智能+电脑小能手2 天前
【大白话说Java面试题 第156题】【06_Spring篇】第16题:Spring 用到了哪些设计模式?
java·spring·设计模式·代理模式·工厂模式
前端百草阁2 天前
JavaScript 设计模式(23 种)
开发语言·前端·javascript·设计模式
geovindu2 天前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
geovindu2 天前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
Kel3 天前
Pregel 为什么会成为LangGraph编排的心脏
人工智能·设计模式·架构
会周易的程序员3 天前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot
geovindu3 天前
go: Functional Options Pattern
开发语言·后端·设计模式·golang·函数式选项模式’·惯用法模式