责任链模式详解
1. 定义:
责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。它将请求的发送者和接收者解耦,允许你将请求沿着处理者链进行传递,直到有一个处理者处理它为止。每个处理者都包含对下一个处理者的引用,形成一条链。
2. 结构:
- Handler (抽象处理者): 定义一个处理请求的接口,并维护一个指向下一个处理者的引用。
- ConcreteHandler (具体处理者): 实现 Handler 接口,处理它所负责的请求。如果可以处理请求,则处理;否则,将请求转发给下一个处理者。
- Client (客户端): 创建处理者链,并向链中的第一个处理者提交请求。
3. 工作流程:
- 客户端创建一个请求,并将其发送给责任链中的第一个处理者。
- 每个处理者依次检查是否能够处理该请求。
- 如果能够处理,则处理请求,并且可以选择是否将请求继续传递给下一个处理者。
- 如果不能处理,则将请求传递给下一个处理者。
- 如果没有任何处理者能够处理请求,则请求可能不会被处理(或者可以有一个默认的处理者)。
4. 优缺点:
-
优点:
- 降低耦合度: 请求的发送者和接收者解耦,客户端不需要知道哪个处理者会处理请求。
- 增强灵活性: 可以动态地添加、删除或修改处理者,改变处理请求的顺序。
- 可扩展性好: 可以方便地添加新的处理者,扩展系统的功能。
- 符合单一职责原则: 每个处理者只需要关注自己的职责。
- 符合开闭原则: 无需修改现有代码,就可以添加新的处理者。
-
缺点:
- 性能问题: 如果责任链过长,或者每个处理者都要进行复杂的判断,可能会影响性能。
- 调试困难: 如果责任链配置不当(例如,循环引用),可能会导致请求无法被处理,或者被错误的处理者处理,增加了调试的难度。
- 不保证被处理: 请求可能会沿着链传递到末尾,但没有任何处理者处理它(可以设置一个默认的处理者来处理这种情况)。
5. 代码示例 (Java):
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 {@Overridepublic 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 {@Overridepublic 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 1handler1.handleRequest(request2); // ConcreteHandler2 handles request: Request 2handler1.handleRequest(request3); // No handler can process this request.}
}
在 Spring Boot 项目中的使用场景
-
请求过滤和拦截 (Filters and Interceptors):
- Servlet 过滤器 (Filter): 最典型的应用.
- Spring Security: 使用责任链模式来实现请求的认证和授权。
- Spring MVC 的拦截器 (HandlerInterceptor): 拦截请求,进行预处理和后处理。
java">// 示例:自定义拦截器 (Spring MVC) public class MyInterceptor implements HandlerInterceptor {@Overridepublic 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 {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦截所有请求// 可以添加多个拦截器,形成拦截器链} }
-
异常处理 (Exception Handling):
- Spring 的
@ExceptionHandler
机制。
java">// 示例:自定义异常处理器 (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");} }
- Spring 的
-
日志处理 (Logging):
- Logback、Log4j2 等日志框架的 Appender 机制。
-
审批流程 (Approval Workflow):
- OA 系统、工作流引擎。
-
事件处理 (Event Handling):
- 自定义事件处理链。
-
数据校验 (Data Validation):
- 多级校验器。
java"> // 示例:数据校验 (与之前示例相同)public interface Validator {boolean validate(String data);}public class NotNullValidator implements Validator {@Overridepublic 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 拦截器)。