目录

责任链模式 (Chain of Responsibility Pattern)

将请求沿处理链传递,直到有对象处理它

概述

责任链模式是一种行为型设计模式,它允许你将请求沿着处理链传递。每个处理者都可以决定处理请求或将其传递给链上的下一个处理者。

适用场景

  • 多个对象可以处理同一请求
  • 需要动态指定处理顺序
  • 不希望显式指定处理者

基础实现

// 处理者接口
public abstract class Handler {
    protected Handler nextHandler;
    
    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }
    
    public final void handle(Request request) {
        if (canHandle(request)) {
            process(request);
        } else if (nextHandler != null) {
            nextHandler.handle(request);
        } else {
            System.out.println("无法处理请求");
        }
    }
    
    protected abstract boolean canHandle(Request request);
    protected abstract void process(Request request);
}

// 具体处理者:经理
public class Manager extends Handler {
    @Override
    protected boolean canHandle(Request request) {
        return request.getAmount() <= 1000;
    }
    
    @Override
    protected void process(Request request) {
        System.out.println("经理审批了 " + request.getAmount() + " 元的申请");
    }
}

// 具体处理者:总监
public class Director extends Handler {
    @Override
    protected boolean canHandle(Request request) {
        return request.getAmount() <= 5000;
    }
    
    @Override
    protected void process(Request request) {
        System.out.println("总监审批了 " + request.getAmount() + " 元的申请");
    }
}

// 使用
Handler manager = new Manager();
Handler director = new Director();
manager.setNext(director);

manager.handle(new Request("报销", 500));   // 经理处理
manager.handle(new Request("报销", 3000));  // 总监处理

Spring 过滤器链

// Spring Security 的过滤器链是责任链的典型应用
@Component
public class AuthFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) {
        if (isAuthenticated(request)) {
            filterChain.doFilter(request, response); // 继续下一个过滤器
        } else {
            response.setStatus(401);
        }
    }
}

优缺点

优点缺点
解耦发送者和接收者请求可能未被处理
动态组合处理者性能可能受影响
符合开闭原则调试困难

总结

责任链模式在 Web 开发中非常常见,Servlet Filter、Spring Interceptor 都使用了这种模式。设计时要注意避免过长的链条影响性能。