🌟 核心思想
职责链模式允许你将请求沿着处理链传递,直到有一个处理者能够处理它。就像公司中的审批流程:员工提交申请后,申请会从主管→经理→总监逐级传递,直到找到有足够权限审批的人。
🏢 现实世界类比:多级审批系统
-
基层员工:提交报销申请(请求)
-
主管:可审批≤1000元的费用
-
经理:可审批≤5000元的费用
-
财务总监:可审批所有费用
-
审批链:主管 → 经理 → 总监
🏗 三大核心角色
角色 | 作用 | 审批系统示例 |
---|---|---|
Handler(处理者接口) | 定义处理请求的接口 | 审批人接口 |
ConcreteHandler(具体处理者) | 实现具体的处理逻辑 | 主管/经理/总监 |
Client(客户端) | 创建处理链并提交请求 | 提交报销的员工 |
📜 代码示例(Java实现)
1. 定义处理者接口和具体处理者
java
复制
// 审批人接口 interface Approver { void setNextApprover(Approver next); void processRequest(Expense expense); } // 具体处理者:主管 class Supervisor implements Approver { private Approver next; private final double MAX_AMOUNT = 1000; public void setNextApprover(Approver next) { this.next = next; } public void processRequest(Expense expense) { if (expense.getAmount() <= MAX_AMOUNT) { System.out.println("主管审批通过:" + expense.getDescription()); } else if (next != null) { next.processRequest(expense); // 传递给下一级 } } } // 具体处理者:经理 class Manager implements Approver { private Approver next; private final double MAX_AMOUNT = 5000; public void setNextApprover(Approver next) { this.next = next; } public void processRequest(Expense expense) { if (expense.getAmount() <= MAX_AMOUNT) { System.out.println("经理审批通过:" + expense.getDescription()); } else if (next != null) { next.processRequest(expense); // 传递给下一级 } } } // 具体处理者:总监 class Director implements Approver { public void setNextApprover(Approver next) { // 总监是最高级别,没有下一级 } public void processRequest(Expense expense) { System.out.println("总监审批通过:" + expense.getDescription()); } }
2. 定义请求对象
java
复制
// 报销申请类 class Expense { private final String description; private final double amount; public Expense(String desc, double amount) { this.description = desc; this.amount = amount; } public double getAmount() { return amount; } public String getDescription() { return description; } }
3. 客户端使用
java
复制
public class Company { public static void main(String[] args) { // 构建责任链 Approver supervisor = new Supervisor(); Approver manager = new Manager(); Approver director = new Director(); supervisor.setNextApprover(manager); manager.setNextApprover(director); // 提交不同金额的报销 supervisor.processRequest(new Expense("办公用品", 800)); // 主管审批 supervisor.processRequest(new Expense("团队建设", 3500)); // 经理审批 supervisor.processRequest(new Expense("年会费用", 20000)); // 总监审批 } }
输出结果:
复制
主管审批通过:办公用品 经理审批通过:团队建设 总监审批通过:年会费用
✅ 优点
✔ 解耦发送者和接收者:请求者无需知道具体处理者
✔ 动态调整责任链:可运行时修改处理链顺序
✔ 符合开闭原则:新增处理者不影响现有代码
❌ 缺点
✖ 请求可能未被处理:需要保证链的完整性
✖ 性能影响:长链可能导致处理延迟
🎯 适用场景
-
需要多个对象处理同一请求,但具体处理者未知
-
需要动态指定处理顺序
-
审批流程、异常处理、事件过滤等场景
典型应用:
-
Java Servlet中的Filter链
-
日志系统的多级过滤
-
游戏中的伤害处理系统
🔄 对比其他模式
模式 | 目的 | 关键区别 |
---|---|---|
职责链模式 | 请求的接力处理 | 关注请求的传递过程 |
命令模式 | 封装请求为对象 | 关注请求的封装与执行 |
状态模式 | 状态驱动的行为改变 | 关注内部状态转换 |
模式进阶技巧
-
短路处理:某些处理者可以直接终止传递
-
组合模式:构建树形责任链
-
拦截机制:双向责任链(处理请求和响应)
总结
职责链模式就像处理接力赛,它:
-
解耦请求与处理:让多个对象都有机会处理请求
-
灵活配置流程:动态调整处理顺序
-
简化对象间连接:每个处理者只需关注下一环节
💡 设计箴言:"让请求在链上旅行,直到找到它的归宿" —— 职责链模式精髓