责任链模式详解

什么是责任链模式?

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,通过创建一个处理请求的接收者链来处理请求。这种模式允许请求沿着处理链传递,直到有一个对象处理它为止。

核心思想

  1. 解耦发送者和接收者:发送者不需要知道具体由哪个接收者处理请求
  2. 动态链式处理:可以灵活地调整处理链的顺序和组成
  3. 责任分离:每个处理器只关注自己负责的部分

工作流程示例

以电商订单处理为例:

  1. 用户提交订单
  2. 系统依次执行:
    • 库存校验(检查商品是否有货)
    • 风控校验(检查用户是否存在欺诈风险)
    • 支付信息校验(检查支付方式是否有效)
    • 物流校验(检查配送地址是否可达)
  3. 任何一个环节失败,整个流程终止并返回相应错误
  4. 所有环节通过后,订单创建完成

模式结构

Handler(抽象处理器)

定义处理请求的接口,通常包含:

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

ConcreteHandler(具体处理器)

实现具体的处理逻辑,例如:

public class InventoryHandler extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (checkInventory(request)) {
            if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        } else {
            throw new RuntimeException("库存不足");
        }
    }
    
    private boolean checkInventory(Request request) {
        // 实际的库存检查逻辑
    }
}

典型应用场景

1. 订单处理系统

  • 库存校验:检查商品库存是否充足
  • 价格校验:检查商品价格是否发生变化
  • 优惠券校验:验证优惠券是否有效
  • 风控校验:评估订单欺诈风险
  • 支付校验:验证支付方式和金额

2. OA审批系统

  • 部门审批:部门经理审批
  • 财务审批:财务部门审核预算
  • 高管审批:总经理/CEO最终审批
  • 归档处理:审批完成后归档

审批金额阈值示例:

  • 5万元以下:部门经理审批
  • 5-50万元:部门经理→财务总监
  • 50万元以上:部门经理→财务总监→CEO

3. Web请求处理

Filter链
  1. 字符编码过滤器:设置请求/响应编码
  2. 认证过滤器:检查用户登录状态
  3. 权限过滤器:验证用户权限
  4. 日志过滤器:记录请求信息
  5. 限流过滤器:防止DDoS攻击
Interceptor链
  1. 参数校验:验证请求参数合法性
  2. 数据转换:格式化请求数据
  3. 性能监控:记录方法执行时间
  4. 异常处理:统一异常捕获和处理

实现方式

基础实现

public abstract class Handler {
    private Handler next;
    
    public Handler setNext(Handler next) {
        this.next = next;
        return next;
    }
    
    public abstract boolean handle(Request request);
    
    protected boolean handleNext(Request request) {
        if (next == null) {
            return true;
        }
        return next.handle(request);
    }
}

Spring中的实现示例

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) {
        return true;
    }
    
    default void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) {
    }
    
    default void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) {
    }
}

优缺点分析

优点

  1. 降低耦合度:发送者无需知道具体处理器
  2. 增强灵活性:可以动态调整处理链
  3. 单一职责:每个处理器只关注自己的逻辑
  4. 可扩展性:新增处理器无需修改现有代码

缺点

  1. 性能影响:长处理链可能影响性能
  2. 调试困难:请求可能在任意环节被处理
  3. 循环引用:处理链配置不当可能导致循环

实际案例

Java Servlet中的FilterChain

public interface FilterChain {
    void doFilter(ServletRequest request, ServletResponse response);
}

// 实现示例
public class ApplicationFilterChain implements FilterChain {
    private Filter[] filters;
    private int position = 0;
    
    public void doFilter(ServletRequest request, ServletResponse response) {
        if (position < filters.length) {
            Filter filter = filters[position++];
            filter.doFilter(request, response, this);
        } else {
            // 调用servlet.service()方法
        }
    }
}

Spring Security的过滤器链

Spring Security使用责任链模式构建了复杂的安全过滤器链,包含:

  1. SecurityContextPersistenceFilter
  2. LogoutFilter
  3. UsernamePasswordAuthenticationFilter
  4. BasicAuthenticationFilter
  5. RememberMeAuthenticationFilter
  6. AnonymousAuthenticationFilter
  7. ExceptionTranslationFilter
  8. FilterSecurityInterceptor
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐