责任链模式详解
责任链模式(Chain of Responsibility) 是一种行为设计模式,允许将请求沿着处理链传递,直到某个处理对象决定处理该请求。核心思想是 解耦请求发送者与接收者,每个处理者持有对下一个处理者的引用,形成处理链。责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,每个处理者都有机会对请求进行处理。
责任链模式深度解析与实战案例
一、模式定义
责任链模式(Chain of Responsibility) 是一种行为设计模式,允许将请求沿着处理链传递,直到某个处理对象决定处理该请求。核心思想是 解耦请求发送者与接收者,每个处理者持有对下一个处理者的引用,形成处理链。
二、核心组件
组件 作用
Handler 定义处理请求的接口,维护下一个处理者
ConcreteHandler 具体处理者,实现请求处理逻辑
Client 创建处理链,发起请求
三、模式优势
动态调整处理流程:运行时修改处理链顺序
单一职责原则:每个处理者专注特定类型请求
开闭原则:新增处理者无需修改现有代码
四、真实场景案例:采购审批系统
场景需求
某企业采购审批流程:
金额 ≤ 1万元:部门经理审批
1万 < 金额 ≤ 5万元:财务总监审批
5万 < 金额 ≤ 10万元:CEO审批
金额 > 10万元:董事会集体审批
五、Java实现代码
1. 抽象处理者
public abstract class Approver {
protected Approver nextApprover; // 下一个处理者
protected String name;
public Approver(String name) {
this.name = name;
}
// 设置下一级审批人
public Approver setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
return this.nextApprover;
}
// 处理审批请求
public abstract void processRequest(PurchaseRequest request);
}
2. 具体处理者实现
// 部门经理
class DepartmentManager extends Approver {
public DepartmentManager(String name) { super(name); }
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() <= 10000) {
System.out.printf("%s 部门经理审批采购单:%s,金额:%.2f元%n",
name, request.getNumber(), request.getAmount());
} else if (nextApprover != null) {
nextApprover.processRequest(request);
}
}
}
// 财务总监
class FinancialDirector extends Approver {
public FinancialDirector(String name) { super(name); }
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() <= 50000) {
System.out.printf("%s 财务总监审批采购单:%s,金额:%.2f元%n",
name, request.getNumber(), request.getAmount());
} else if (nextApprover != null) {
nextApprover.processRequest(request);
}
}
}
// CEO
class CEO extends Approver {
public CEO(String name) { super(name); }
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() <= 100000) {
System.out.printf("%s CEO审批采购单:%s,金额:%.2f元%n",
name, request.getNumber(), request.getAmount());
} else if (nextApprover != null) {
nextApprover.processRequest(request);
}
}
}
// 董事会
class Board extends Approver {
public Board(String name) { super(name); }
@Override
public void processRequest(PurchaseRequest request) {
System.out.printf("%s 董事会审批采购单:%s,金额:%.2f元%n",
name, request.getNumber(), request.getAmount());
}
}
3. 请求对象
public class PurchaseRequest {
private String number; // 采购单号
private double amount; // 金额
private String purpose; // 用途
// 构造方法、getter/setter省略
}
4. 客户端使用
public class ApprovalSystem {
public static void main(String[] args) {
// 构建责任链
Approver manager = new DepartmentManager("张经理");
Approver director = new FinancialDirector("李总监");
Approver ceo = new CEO("王总");
Approver board = new Board("董事会");
manager.setNextApprover(director)
.setNextApprover(ceo)
.setNextApprover(board);
// 模拟采购请求
processRequest(manager, new PurchaseRequest("CG202307001", 8000, "办公用品"));
processRequest(manager, new PurchaseRequest("CG202307002", 35000, "服务器采购"));
processRequest(manager, new PurchaseRequest("CG202307003", 150000, "厂房扩建"));
}
private static void processRequest(Approver approver, PurchaseRequest request) {
System.out.println("\n=== 处理采购单:" + request.getNumber() + " ===");
approver.processRequest(request);
}
}
六、运行结果
=== 处理采购单:CG202307001 ===
张经理 部门经理审批采购单:CG202307001,金额:8000.00元
=== 处理采购单:CG202307002 ===
李总监 财务总监审批采购单:CG202307002,金额:35000.00元
=== 处理采购单:CG202307003 ===
董事会 董事会审批采购单:CG202307003,金额:150000.00元
七、模式变体与优化
1. 功能增强方向
// 增加审批结果反馈机制
public enum ApprovalResult {
APPROVED, REJECTED, PENDING
}
abstract class EnhancedApprover {
public abstract ApprovalResult processEnhancedRequest(PurchaseRequest request);
}
// 添加审批备注功能
public class AuditRecord {
private String approverName;
private LocalDateTime auditTime;
private String comments;
}
2. 动态配置审批流程
// 使用配置中心动态调整审批链
public class DynamicApprovalChain {
private List<Approver> approvers = new ArrayList<>();
public void reloadChain(ApprovalConfig config) {
// 根据配置重新构建责任链
}
}
八、行业应用场景
场景 | 具体应用 | 优势体现 |
---|---|---|
Web请求过滤 | Servlet Filter Chain | 顺序处理HTTP请求/响应 |
异常处理 | Spring MVC异常处理机制 | 分层处理不同异常类型 |
权限校验 | Spring Security过滤器链 | 多维度安全检查 |
游戏事件处理 | 伤害计算链(护甲/抗性/增益计算) | 灵活组合计算规则 |
金融风控系统 | 多级风控规则校验 | 动态调整风控策略 |
九、最佳实践建议
链长度控制
建议处理链不超过7个节点(遵循米勒法则)
复杂场景使用 组合模式 管理处理链
终止机制设计
// 显式终止处理流程
public interface TerminableHandler {
void terminate();
}
性能优化
高频场景使用 责任树 代替单链
并行处理分支链(需保证线程安全)
调试技巧
// 添加链追踪ID
public class TraceableRequest {
private String traceId;
private List<String> handlerLog = new ArrayList<>();
}
十、与相似模式对比
模式 | 核心差异 | 适用场景 |
---|---|---|
责任链 | 强调请求传递,不保证被处理 | 多级审批/过滤 |
命令模式 | 封装操作请求,支持撤销/重做 | 事务操作/任务队列 |
策略模式 | 多个算法选择其一执行 | 支付方式选择/压缩算法切换 |
管道模式 | 每个处理者都会处理请求 | 数据加工流水线 |
通过这个完整的采购审批案例,可以清晰看到责任链模式如何 有效解耦业务处理逻辑。在实际开发中,可结合具体业务需求进行扩展,例如添加审批日志、动态调整审批规则等,使系统保持高度灵活性和可维护性。
正常情况下不会有这种审批使用责任链,比如java servlet以及spring实现的拦截链以及过滤链来对请求数据进行预处理、权限校验、日志记录等操作比较常用
一句话总结
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,每个处理者都有机会对请求进行处理。
更多推荐
所有评论(0)