责任链模式:请求处理的流水线
摘要
责任链模式(Chain of Responsibility Pattern)是行为型设计模式中的"请求传递专家",它通过构建处理对象的链来解耦请求的发送者和接收者。本文将全面剖析责任链模式的核心概念、实现方式、应用场景及高级变体,通过丰富的Java代码示例展示如何构建灵活的处理流水线,并分析其与状态模式、策略模式的区别与适用场景。
一、责任链模式核心思想
责任链模式的核心是构建处理链,具有以下关键特征:
- 链式处理:多个处理对象形成处理链
- 动态配置:可灵活调整处理链顺序
- 解耦发送者与接收者:发送者无需知道具体处理者
- 处理可终止:任一处理者可终止处理流程
适用场景:
- 多个对象可以处理同一请求但具体处理者未知
- 需要动态指定处理请求的对象集合
- 需要按顺序传递请求直到被处理
- 希望在不明确指定接收者的情况下向多个对象发送请求
二、责任链模式结构解析
UML类图示意
[Handler] <|-- [ConcreteHandlerA]
[Handler] <|-- [ConcreteHandlerB]
[Handler] o--> [Handler]
核心组件角色
角色 |
职责 |
典型实现 |
Handler |
处理者接口 |
定义处理请求的接口 |
ConcreteHandler |
具体处理者 |
实现处理逻辑,维护后继者 |
Client |
客户端 |
创建处理链并触发请求 |
三、基础实现:审批流程案例
// 审批请求
class ApprovalRequest {private String requestId;private String requestType;private double amount;public ApprovalRequest(String requestId, String requestType, double amount) {this.requestId = requestId;this.requestType = requestType;this.amount = amount;}// getters...
}// 审批处理器接口
interface Approver {void setNextApprover(Approver nextApprover);void processRequest(ApprovalRequest request);
}// 具体审批者:经理
class Manager implements Approver {private Approver nextApprover;private static final double APPROVAL_LIMIT = 5000;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(ApprovalRequest request) {if (request.getAmount() <= APPROVAL_LIMIT) {System.out.println("Manager approves request " + request.getRequestId());} else if (nextApprover != null) {nextApprover.processRequest(request);} else {System.out.println("Request " + request.getRequestId() + " requires higher approval");}}
}// 具体审批者:总监
class Director implements Approver {private Approver nextApprover;private static final double APPROVAL_LIMIT = 20000;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(ApprovalRequest request) {if (request.getAmount() <= APPROVAL_LIMIT) {System.out.println("Director approves request " + request.getRequestId());} else if (nextApprover != null) {nextApprover.processRequest(request);} else {System.out.println("Request " + request.getRequestId() + " requires executive approval");}}
}// 具体审批者:副总裁
class VicePresident implements Approver {private static final double APPROVAL_LIMIT = 50000;@Overridepublic void setNextApprover(Approver nextApprover) {// 副总裁是最高审批者,无后继者}@Overridepublic void processRequest(ApprovalRequest request) {if (request.getAmount() <= APPROVAL_LIMIT) {System.out.println("Vice President approves request " + request.getRequestId());} else {System.out.println("Request " + request.getRequestId() + " requires board approval");}}
}// 客户端使用
public class ApprovalSystem {public static void main(String[] args) {// 构建责任链Approver manager = new Manager();Approver director = new Director();Approver vp = new VicePresident();manager.setNextApprover(director);director.setNextApprover(vp);// 创建审批请求ApprovalRequest request1 = new ApprovalRequest("REQ001", "Travel", 3000);ApprovalRequest request2 = new ApprovalRequest("REQ002", "Equipment", 15000);ApprovalRequest request3 = new ApprovalRequest("REQ003", "Conference", 45000);ApprovalRequest request4 = new ApprovalRequest("REQ004", "Bonus", 60000);// 处理请求manager.processRequest(request1);manager.processRequest(request2);manager.processRequest(request3);manager.processRequest(request4);}
}
四、高级应用:Web请求过滤器链
1. 基础过滤器实现
// 过滤器接口
interface Filter {void doFilter(HttpRequest request, HttpResponse response, FilterChain chain);
}// 过滤器链
class FilterChain {private List<Filter> filters = new ArrayList<>();private int index = 0;public FilterChain addFilter(Filter filter) {filters.add(filter);return this;}public void doFilter(HttpRequest request, HttpResponse response) {if (index < filters.size()) {Filter filter = filters.get(index++);filter.doFilter(request, response, this);} else {// 所有过滤器处理完毕,执行业务逻辑processBusiness(request, response);}}private void processBusiness(HttpRequest request, HttpResponse response) {System.out.println("Processing business logic for " + request.getPath());response.setStatus(200);response.setBody("Request processed successfully");}
}// 具体过滤器:认证过滤器
class AuthenticationFilter implements Filter {@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {System.out.println("Authenticating request...");if (request.getHeader("Authorization") == null) {response.setStatus(401);response.setBody("Unauthorized");} else {chain.doFilter(request, response);}}
}// 具体过滤器:日志过滤器
class LoggingFilter implements Filter {@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {System.out.println("Logging request: " + request.getMethod() + " " + request.getPath());long startTime = System.currentTimeMillis();chain.doFilter(request, response);long duration = System.currentTimeMillis() - startTime;System.out.println("Request processed in " + duration + "ms");}
}// 具体过滤器:缓存过滤器
class CacheFilter implements Filter {private Map<String, HttpResponse> cache = new HashMap<>();@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {String cacheKey = request.getMethod() + ":" + request.getPath();if (cache.containsKey(cacheKey)) {System.out.println("Returning cached response");HttpResponse cachedResponse = cache.get(cacheKey);response.copyFrom(cachedResponse);} else {chain.doFilter(request, response);if (response.getStatus() == 200) {cache.put(cacheKey, response.copy());}}}
}// 使用示例
public class WebServer {public static void main(String[] args) {FilterChain chain = new FilterChain().addFilter(new LoggingFilter()).addFilter(new AuthenticationFilter()).addFilter(new CacheFilter());HttpRequest request = new HttpRequest("GET", "/api/users", Map.of("Authorization", "Bearer token123"));HttpResponse response = new HttpResponse();chain.doFilter(request, response);System.out.println("Final response: " + response.getStatus());}
}
2. Spring Security过滤器链
// 模拟Spring Security的过滤器链
class SecurityFilterChain {private List<SecurityFilter> filters;public SecurityFilterChain(List<SecurityFilter> filters) {this.filters = new ArrayList<>(filters);}public void doFilterInternal(HttpServletRequest request, HttpServletResponse response) throws IOException {VirtualFilterChain virtualChain = new VirtualFilterChain(filters);virtualChain.doFilter(request, response);}private static class VirtualFilterChain {private final List<SecurityFilter> additionalFilters;private int currentPosition = 0;public VirtualFilterChain(List<SecurityFilter> additionalFilters) {this.additionalFilters = additionalFilters;}public void doFilter(HttpServletRequest request, HttpServletResponse response) throws IOException {if (currentPosition == additionalFilters.size()) {// 执行实际请求处理return;}currentPosition++;SecurityFilter nextFilter = additionalFilters.get(currentPosition - 1);nextFilter.doFilter(request, response, this);}}
}interface SecurityFilter {void doFilter(HttpServletRequest request, HttpServletResponse response,SecurityFilterChain chain) throws IOException;
}// 具体安全过滤器
class CsrfFilter implements SecurityFilter {public void doFilter(HttpServletRequest request, HttpServletResponse response,SecurityFilterChain chain) throws IOException {String csrfToken = request.getHeader("X-CSRF-TOKEN");if (csrfToken == null || !isValidCsrfToken(csrfToken)) {response.sendError(403, "Invalid CSRF token");return;}chain.doFilter(request, response);}private boolean isValidCsrfToken(String token) {// 验证逻辑...return true;}
}class CorsFilter implements SecurityFilter {public void doFilter(HttpServletRequest request, HttpServletResponse response,SecurityFilterChain chain) throws IOException {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "GET, POST");chain.doFilter(request, response);}
}
五、责任链模式优缺点分析
优点:
优点 |
说明 |
解耦发送者与接收者 |
发送者无需知道具体处理者 |
动态配置处理链 |
可灵活调整处理顺序 |
单一职责原则 |
每个处理者只关注自己责任范围 |
开闭原则 |
新增处理者不影响现有代码 |
缺点:
缺点 |
说明 |
请求可能未被处理 |
链中没有合适处理者 |
性能影响 |
长链可能导致处理延迟 |
调试困难 |
请求传递路径不易跟踪 |
循环引用风险 |
处理链形成循环 |
六、责任链模式与其他模式对比
责任链模式 vs 装饰器模式
维度 |
责任链模式 |
装饰器模式 |
目的 |
处理请求直到被处理 |
动态添加职责 |
控制流 |
可终止传递 |
必须传递到所有装饰器 |
关注点 |
请求处理 |
对象增强 |
典型应用 |
审批流程、过滤器 |
IO流、UI组件 |
责任链模式 vs 状态模式
维度 |
责任链模式 |
状态模式 |
目的 |
传递请求到合适处理者 |
对象行为随状态改变 |
处理者关系 |
相互独立 |
状态相互了解 |
变化点 |
处理链配置 |
状态转换 |
典型应用 |
工作流处理 |
订单状态管理 |
七、责任链模式最佳实践
1. 责任链构建器
class ChainBuilder<T> {private List<Handler<T>> handlers = new ArrayList<>();public ChainBuilder<T> addHandler(Handler<T> handler) {handlers.add(handler);return this;}public Handler<T> build() {if (handlers.isEmpty()) {throw new IllegalStateException("No handlers added");}for (int i = 0; i < handlers.size() - 1; i++) {handlers.get(i).setNext(handlers.get(i + 1));}return handlers.get(0);}
}// 使用示例
Handler<ApprovalRequest> approvalChain = new ChainBuilder<ApprovalRequest>().addHandler(new Manager()).addHandler(new Director()).addHandler(new VicePresident()).build();approvalChain.handleRequest(new ApprovalRequest("REQ005", "Training", 8000));
2. 功能组合责任链
// 组合多个责任链
class CompositeChain<T> implements Handler<T> {private List<Handler<T>> chains = new ArrayList<>();public void addChain(Handler<T> chain) {chains.add(chain);}@Overridepublic void handleRequest(T request) {for (Handler<T> chain : chains) {chain.handleRequest(request);}}
}// 使用示例
CompositeChain<HttpRequest> httpChains = new CompositeChain<>();
httpChains.addChain(buildSecurityChain());
httpChains.addChain(buildLoggingChain());
httpChains.addChain(buildMonitoringChain());httpChains.handleRequest(request);
3. 中断标记责任链
// 带中断标记的处理结果
class ProcessingResult {private boolean shouldContinue;private Object response;public ProcessingResult(boolean shouldContinue, Object response) {this.shouldContinue = shouldContinue;this.response = response;}// getters...
}// 改进的处理器接口
interface InterruptibleHandler<T, R> {ProcessingResult<R> handle(T request);void setNext(InterruptibleHandler<T, R> next);
}// 改进的责任链
class InterruptibleChain<T, R> {private InterruptibleHandler<T, R> firstHandler;public InterruptibleChain(InterruptibleHandler<T, R>... handlers) {if (handlers.length == 0) {throw new IllegalArgumentException("At least one handler required");}this.firstHandler = handlers[0];for (int i = 0; i < handlers.length - 1; i++) {handlers[i].setNext(handlers[i + 1]);}}public ProcessingResult<R> execute(T request) {return firstHandler.handle(request);}
}
八、责任链模式在开源框架中的应用
Java Servlet过滤器
// Servlet过滤器是责任链模式的典型实现
@WebFilter("/*")
public class LoggingFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("Before request processing");long startTime = System.currentTimeMillis();chain.doFilter(request, response); // 传递到下一个过滤器long duration = System.currentTimeMillis() - startTime;System.out.println("Request processed in " + duration + "ms");}
}@WebFilter("/secure/*")
public class AuthenticationFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;if (httpRequest.getSession(false) == null) {((HttpServletResponse)response).sendError(401);return; // 中断链}chain.doFilter(request, response);}
}
Spring MVC拦截器
// HandlerInterceptor是责任链模式的变体
public class LogInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 返回true继续链,false中断return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 处理完成后执行}
}// 配置拦截器链
@Configuration
public class WebConfig implements WebMvcConfigurer {public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor());registry.addInterceptor(new AuthInterceptor());registry.addInterceptor(new PerformanceInterceptor());}
}
九、高级应用:动态可配置责任链
1. 规则引擎责任链
// 基于规则的责任链
class RuleEngine {private List<Rule> rules = new ArrayList<>();public void addRule(Rule rule) {rules.add(rule);}public Object evaluate(Facts facts) {for (Rule rule : rules) {if (rule.matches(facts)) {return rule.execute(facts);}}throw new NoApplicableRuleException();}
}interface Rule {boolean matches(Facts facts);Object execute(Facts facts);
}// 使用示例
RuleEngine engine = new RuleEngine();
engine.addRule(new DiscountRule());
engine.addRule(new TaxRule());
engine.addRule(new ShippingRule());Facts orderFacts = new Facts(order);
Object result = engine.evaluate(orderFacts);
2. 工作流引擎责任链
// 可配置的工作流责任链
class WorkflowEngine {private Map<String, Workflow> workflows = new HashMap<>();public void registerWorkflow(String name, Workflow workflow) {workflows.put(name, workflow);}public void executeWorkflow(String name, Context context) {Workflow workflow = workflows.get(name);if (workflow != null) {workflow.execute(context);}}
}class Workflow {private List<WorkflowStep> steps = new ArrayList<>();public void addStep(WorkflowStep step) {steps.add(step);}public void execute(Context context) {for (WorkflowStep step : steps) {if (!step.execute(context)) {break; // 步骤可中断流程}}}
}interface WorkflowStep {boolean execute(Context context);
}
十、责任链模式未来发展趋势
新兴应用方向:
- 微服务编排:服务调用链式管理
- 函数式编程:组合函数形成处理链
- 事件溯源:事件处理责任链
- AI决策流水线:AI模型链式调用
- 区块链智能合约:合约执行链
响应式责任链
// Reactor中的责任链
Flux<String> processingChain = Flux.just("request").flatMap(this::step1).flatMap(this::step2).flatMap(this::step3).onErrorResume(this::handleError);processingChain.subscribe(result -> System.out.println("Processed: " + result),error -> System.err.println("Error: " + error)
);Mono<String> step1(String input) {return Mono.fromCallable(() -> {// 处理步骤1return input + " processed by step1";});
}
总结
责任链模式是处理请求传递和处理的强大工具,特别适合多阶段处理流程的场景。其核心价值体现在:
- 解耦处理逻辑:分离请求发送者和处理者
- 动态配置:灵活调整处理链结构和顺序
- 单一职责:每个处理者专注特定功能
- 可扩展性:新增处理者不影响现有代码
现代应用关键点:
- 合理划分职责:明确每个处理者的责任边界
- 链长控制:避免过长的处理链影响性能
- 错误处理:完善处理链中的异常处理机制
- 与模式组合:结合工厂、策略等模式增强灵活性
- 响应式支持:适应异步非阻塞处理场景
责任链模式正在与函数式编程、响应式编程等现代范式结合,演进出更强大的流程处理能力。掌握责任链模式的精髓,将帮助开发者构建出更加灵活、可维护的系统架构,特别是在复杂业务流程和工作流管理领域。