责任链模式的核心思想特别像快递分拣流程。比如一个包裹从收货站出发,先经过市级中心判断是否本地件,再流转到省级中心检查是否加急,最后才决定发往全国枢纽。每个环节只关心自己能否处理,不行就甩给下一站,全程不用总控中心操心。对应到代码里,就是把多个处理对象串成一条链,请求像击鼓传花一样挨个路过它们,谁合适谁接手。
先看模式的结构。最核心的是抽象处理器(Handler),它定义两个东西:一个处理请求的方法,比如,还有一个指向下一个处理器的引用。具体处理器(ConcreteHandler)继承这个抽象类,实现自己的业务逻辑。如果当前处理器搞不定,就调用后继者的方法把请求传下去。最后是客户端(Client),它负责把珠子穿成链,并把请求丢到链头。
这模式最大的好处是解耦。比如要做日志系统,咱们可以把Debug、Info、Error三个处理器串起来。Debug只管输出调试信息,Info记录常规操作,Error专抓异常。哪天想加个Warn级别?直接插个新处理器进链里,旧代码毫发无伤。再比如审批流程,组长批完转经理,经理批完转总监,每个节点只需关注自己的审批阈值。
不过它也有坑。万一链太长,请求得像逛迷宫似的绕半天,性能肯定受影响。更头疼的是容易丢包------要是某个处理器忘了调用后继者,请求就半路失踪了。所以用的时候得记得在链尾放个兜底处理器,像垃圾分类里的"其他垃圾"桶,专收没人要的请求。
下面用代码模拟费用报销审批场景。假设基层员工只能批500元以内,经理能批2000元,再往上就得找总监。先定义抽象处理器:
具体处理器继承这个基类,实现不同级别的审批逻辑:
请求对象就是个简单的DTO:
客户端组装责任链并触发请求:
跑起来会发现,300元的单子被员工拦截,1500元的溜到经理那儿,5000元的则一路冲到总监手里。这种设计让审批逻辑分散在各处理器中,哪天要调整金额阈值或增加CFO节点,改起来那叫一个丝滑。
实际项目中,Spring拦截器、Servlet过滤器都是责任链的经典应用。但要注意别滥用,如果处理器之间存在强依赖关系,或者请求必须按固定顺序处理,那还是老老实实用策略模式或模板方法更稳妥。总之,把责任链当成乐高积木,用的好能拼出高扩展性架构,用不好就成了甩锅全家桶。下次遇到多层条件判断时,不妨试试这条链,保准让你直呼真香。