责任链模式详解和在SpringBoot项目中的使用场景
- 电脑硬件
- 2025-09-15 09:51:02

责任链模式详解
1. 定义:
责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。它将请求的发送者和接收者解耦,允许你将请求沿着处理者链进行传递,直到有一个处理者处理它为止。每个处理者都包含对下一个处理者的引用,形成一条链。
2. 结构:
Handler (抽象处理者): 定义一个处理请求的接口,并维护一个指向下一个处理者的引用。ConcreteHandler (具体处理者): 实现 Handler 接口,处理它所负责的请求。如果可以处理请求,则处理;否则,将请求转发给下一个处理者。Client (客户端): 创建处理者链,并向链中的第一个处理者提交请求。3. 工作流程:
客户端创建一个请求,并将其发送给责任链中的第一个处理者。每个处理者依次检查是否能够处理该请求。如果能够处理,则处理请求,并且可以选择是否将请求继续传递给下一个处理者。如果不能处理,则将请求传递给下一个处理者。如果没有任何处理者能够处理请求,则请求可能不会被处理(或者可以有一个默认的处理者)。4. 优缺点:
优点:
降低耦合度: 请求的发送者和接收者解耦,客户端不需要知道哪个处理者会处理请求。增强灵活性: 可以动态地添加、删除或修改处理者,改变处理请求的顺序。可扩展性好: 可以方便地添加新的处理者,扩展系统的功能。符合单一职责原则: 每个处理者只需要关注自己的职责。符合开闭原则: 无需修改现有代码,就可以添加新的处理者。缺点:
性能问题: 如果责任链过长,或者每个处理者都要进行复杂的判断,可能会影响性能。调试困难: 如果责任链配置不当(例如,循环引用),可能会导致请求无法被处理,或者被错误的处理者处理,增加了调试的难度。不保证被处理: 请求可能会沿着链传递到末尾,但没有任何处理者处理它(可以设置一个默认的处理者来处理这种情况)。5. 代码示例 (Java):
// 抽象处理者 (Handler) abstract class Handler { protected Handler nextHandler; public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public abstract void handleRequest(Request request); } // 具体处理者 (ConcreteHandler) class ConcreteHandler1 extends Handler { @Override public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE1) { System.out.println("ConcreteHandler1 handles request: " + request.getDescription()); } else if (nextHandler != null) { nextHandler.handleRequest(request); } else { System.out.println("No handler can process this request."); } } } class ConcreteHandler2 extends Handler { @Override public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE2) { System.out.println("ConcreteHandler2 handles request: " + request.getDescription()); } else if (nextHandler != null) { nextHandler.handleRequest(request); }else { System.out.println("No handler can process this request."); } } } // 请求 enum RequestType{ TYPE1, TYPE2, TYPE3 } class Request { private RequestType type; private String description; public Request(RequestType type, String description) { this.type = type; this.description = description; } public RequestType getType() { return type; } public String getDescription() { return description; } } // 客户端 (Client) public class ChainOfResponsibilityExample { public static void main(String[] args) { // 创建处理者 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); // 构建责任链 handler1.setNextHandler(handler2); // 创建请求 Request request1 = new Request(RequestType.TYPE1, "Request 1"); Request request2 = new Request(RequestType.TYPE2, "Request 2"); Request request3 = new Request(RequestType.TYPE3, "Request 3"); // 发送请求 handler1.handleRequest(request1); // ConcreteHandler1 handles request: Request 1 handler1.handleRequest(request2); // ConcreteHandler2 handles request: Request 2 handler1.handleRequest(request3); // No handler can process this request. } } 在 Spring Boot 项目中的使用场景请求过滤和拦截 (Filters and Interceptors):
Servlet 过滤器 (Filter): 最典型的应用.Spring Security: 使用责任链模式来实现请求的认证和授权。Spring MVC 的拦截器 (HandlerInterceptor): 拦截请求,进行预处理和后处理。 // 示例:自定义拦截器 (Spring MVC) public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 执行拦截逻辑 if (/* 满足条件 */) { return true; // 继续执行后续的拦截器和处理器 } else { return false; // 阻止请求继续执行 } } // postHandle, afterCompletion 方法 (可选) } // 配置拦截器链 (Spring Boot) @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**"); // 拦截所有请求 // 可以添加多个拦截器,形成拦截器链 } }异常处理 (Exception Handling):
Spring 的 @ExceptionHandler 机制。 // 示例:自定义异常处理器 (Spring MVC) @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MyCustomException.class) public ResponseEntity<String> handleMyCustomException(MyCustomException ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleGenericException(Exception ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } }日志处理 (Logging):
Logback、Log4j2 等日志框架的 Appender 机制。审批流程 (Approval Workflow):
OA 系统、工作流引擎。事件处理 (Event Handling):
自定义事件处理链。数据校验 (Data Validation):
多级校验器。 // 示例:数据校验 (与之前示例相同) public interface Validator { boolean validate(String data); } public class NotNullValidator implements Validator { @Override public boolean validate(String data) { return data != null; } } // 其他校验器 (NotEmptyValidator, MaxLengthValidator, ...) public class ValidationChain { private List<Validator> validators = new ArrayList<>(); public void addValidator(Validator validator) { validators.add(validator); } public boolean validate(String data) { for (Validator validator : validators) { if (!validator.validate(data)) { return false; } } return true; } }Spring Cloud Gateway 的 Filter:
Spring Cloud Gateway 使用责任链模式来处理请求。可以自定义 Filter,实现各种功能,例如: 身份验证请求限流请求转发请求日志总结:
责任链模式是一种非常实用的设计模式,在 Spring Boot 项目中有很多应用场景。 Spring 框架本身也大量使用了责任链模式(例如,Servlet 过滤器、Spring Security、Spring MVC 拦截器)。
责任链模式详解和在SpringBoot项目中的使用场景由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“责任链模式详解和在SpringBoot项目中的使用场景”
下一篇
第十五届蓝桥杯:dfs之数字接龙