手搓责任链框架 1:责任链模式概念

68 阅读4分钟

责任链模式概念

概述

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

核心思想

责任链模式的核心思想是解耦请求的发送者和接收者,通过给多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合关系。

基本结构

graph TD
    A[客户端请求] --> B[处理器1]
    B -->|能处理| B1[处理并返回]
    B -->|不能处理| C[处理器2]
    C -->|能处理| C1[处理并返回]
    C -->|不能处理| D[处理器3]
    D -->|能处理| D1[处理并返回]
    D -->|不能处理| E[请求未被处理]

工作原理

  1. 链式结构:多个处理者对象连成一条链
  2. 请求传递:请求在链上传递,直到有处理者处理它
  3. 动态组合:可以动态地添加或删除处理者
  4. 职责分离:每个处理者只关注自己能处理的请求类型

典型应用场景

1. Web 过滤器链

在 Web 应用中,HTTP 请求需要经过多个过滤器处理:

graph LR
    A[HTTP请求] --> B[认证过滤器]
    B --> C[授权过滤器]
    C --> D[日志过滤器]
    D --> E[业务处理器]
    E --> F[HTTP响应]

应用示例:

  • Servlet Filter 链
  • Spring Security 过滤器链
  • 网关路由过滤器

2. 审批流程

企业审批系统中的多级审批流程:

graph TD
    A[提交申请] --> B{金额 < 1000?}
    B -->|是| C[部门主管审批]
    B -->|否| D{金额 < 10000?}
    D -->|是| E[部门经理审批]
    D -->|否| F[总经理审批]
    C --> G[审批完成]
    E --> G
    F --> G

应用示例:

  • 请假审批
  • 费用报销
  • 采购申请
  • 合同审批

3. 异常处理

多层异常处理机制:

graph TD
    A[异常发生] --> B[业务异常处理器]
    B -->|无法处理| C[系统异常处理器]
    C -->|无法处理| D[默认异常处理器]
    D --> E[记录日志并返回错误信息]

应用示例:

  • Spring MVC 异常处理
  • 日志框架的 Appender 链
  • 错误恢复机制

4. 数据验证

多层数据验证处理:

graph LR
    A[用户输入] --> B[格式验证]
    B --> C[业务规则验证]
    C --> D[权限验证]
    D --> E[数据持久化]

应用示例:

  • 表单验证
  • API 参数校验
  • 数据完整性检查

模式优缺点

优点

1. 降低耦合度
  • 发送者与接收者解耦:发送者不需要知道具体哪个接收者会处理请求
  • 处理者之间解耦:每个处理者只需要知道下一个处理者的引用
2. 增强灵活性
  • 动态配置:可以在运行时动态地添加或删除处理者
  • 顺序可变:可以改变处理者在链中的顺序
3. 符合开闭原则
  • 易于扩展:添加新的处理者不需要修改现有代码
  • 职责单一:每个处理者只负责自己的处理逻辑
4. 简化对象
  • 分而治之:复杂的处理逻辑被分解为多个简单的处理者
  • 代码复用:处理者可以在不同的链中重复使用

缺点

1. 性能问题
  • 链式调用开销:请求可能需要遍历整个链才能被处理
  • 内存占用:需要维护处理者链的引用关系
2. 调试困难
  • 执行路径不明确:很难预测请求会被哪个处理者处理
  • 链式调用复杂:调试时需要跟踪整个调用链
3. 不保证处理
  • 可能无人处理:如果链配置不当,请求可能不被任何处理者处理
  • 处理结果不确定:无法保证请求一定会得到期望的处理结果

与其他模式的关系

1. 与装饰器模式的区别

特性责任链模式装饰器模式
目的传递请求直到被处理动态添加功能
处理方式选择性处理层层包装
结果可能不处理必定处理

2. 与策略模式的区别

特性责任链模式策略模式
选择机制自动选择手动选择
处理者数量多个一个
组合方式链式组合单一替换

实现要点

1. 抽象处理者

public abstract class Handler {
    protected Handler nextHandler;
    
    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }
    
    public abstract void handleRequest(Request request);
}

2. 具体处理者

public class ConcreteHandler extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (canHandle(request)) {
            // 处理请求
            process(request);
        } else if (nextHandler != null) {
            // 传递给下一个处理者
            nextHandler.handleRequest(request);
        }
    }
    
    private boolean canHandle(Request request) {
        // 判断是否能处理该请求
        return true;
    }
    
    private void process(Request request) {
        // 具体的处理逻辑
    }
}

3. 客户端使用

public class Client {
    public void setupChain() {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
        
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        
        // 发送请求
        handler1.handleRequest(new Request());
    }
}

总结

责任链模式是一种强大的设计模式,特别适用于需要多个对象协作处理请求的场景。通过将处理者组织成链式结构,它提供了一种灵活的方式来处理复杂的业务逻辑,同时保持了良好的可扩展性和可维护性。

在实际应用中,责任链模式广泛应用于 Web 开发、工作流引擎、异常处理等领域,是每个有经验的开发者都应该掌握的重要设计模式。