责任链模式深度解析与实战案例

一、模式定义

责任链模式(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实现的拦截链以及过滤链来对请求数据进行预处理、权限校验、日志记录等操作比较常用

一句话总结

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,每个处理者都有机会对请求进行处理。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐