Java设计模式之责任链

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

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

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

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

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

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

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

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

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

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

相关推荐
阿闽ooo3 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4963 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃3 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20103 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈3 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||4 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智4 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香4 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当20104 天前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当20104 天前
设计模式之迭代器模式
设计模式·迭代器模式