23种设计模式-行为型模式之责任链模式(Java版本)
Java 责任链模式(Chain of Responsibility Pattern)详解
🧠 什么是责任链模式?
责任链模式是一种行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
🎯 使用场景
- 多个对象可以处理一个请求,具体由运行时决定哪个对象处理
- 动态指定请求的处理顺序
- 需要解耦请求发送者与处理者
🏗️ 模式结构
- Handler(抽象处理者):定义处理请求的接口,并包含对下一个处理者的引用
- ConcreteHandler(具体处理者):实现请求的处理逻辑,如果不能处理则转发给下一个处理者
- Client(客户端):构造处理链并发送请求
✅ 示例:请假审批流程
抽象处理者
public abstract class Handler {protected Handler next;public void setNext(Handler next) {this.next = next;}public abstract void handleRequest(int days);
}
具体处理者
public class TeamLeader extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 1) {System.out.println("TeamLeader 批准了 " + days + " 天的假期");} else if (next != null) {next.handleRequest(days);}}
}public class Manager extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 3) {System.out.println("Manager 批准了 " + days + " 天的假期");} else if (next != null) {next.handleRequest(days);}}
}public class Director extends Handler {@Overridepublic void handleRequest(int days) {if (days <= 7) {System.out.println("Director 批准了 " + days + " 天的假期");} else {System.out.println("请假天数太长,无法批准!");}}
}
客户端
public class LeaveRequest {public static void main(String[] args) {Handler teamLeader = new TeamLeader();Handler manager = new Manager();Handler director = new Director();teamLeader.setNext(manager);manager.setNext(director);teamLeader.handleRequest(2); // 输出:Manager 批准了 2 天的假期teamLeader.handleRequest(5); // 输出:Director 批准了 5 天的假期teamLeader.handleRequest(10); // 输出:请假天数太长,无法批准!}
}
✅ 优点
- 降低耦合度,请求者无需知道处理逻辑细节
- 动态组合处理流程,增强灵活性
- 符合开闭原则,新增处理节点无需修改其他节点
⚠️ 缺点
- 可能导致请求没有被处理
- 调试不便,链路较长时难以追踪请求处理流程
🧩 使用建议
责任链模式非常适合处理审批流程、过滤器链、日志处理等需要“逐层传递、逐层判断”的场景。