责任链模式详解和在Spring Boot 项目中的使用场景

embedded/2025/3/4 20:00:34/

责任链模式详解

1. 定义:

责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。它将请求的发送者和接收者解耦,允许你将请求沿着处理者链进行传递,直到有一个处理者处理它为止。每个处理者都包含对下一个处理者的引用,形成一条链。

2. 结构:

  • Handler (抽象处理者): 定义一个处理请求的接口,并维护一个指向下一个处理者的引用。
  • ConcreteHandler (具体处理者): 实现 Handler 接口,处理它所负责的请求。如果可以处理请求,则处理;否则,将请求转发给下一个处理者。
  • Client (客户端): 创建处理者链,并向链中的第一个处理者提交请求。

3. 工作流程:

  1. 客户端创建一个请求,并将其发送给责任链中的第一个处理者。
  2. 每个处理者依次检查是否能够处理该请求。
  3. 如果能够处理,则处理请求,并且可以选择是否将请求继续传递给下一个处理者。
  4. 如果不能处理,则将请求传递给下一个处理者。
  5. 如果没有任何处理者能够处理请求,则请求可能不会被处理(或者可以有一个默认的处理者)。

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 项目中的使用场景

  1. 请求过滤和拦截 (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("/**"); // 拦截所有请求// 可以添加多个拦截器,形成拦截器链}
    }
    
  2. 异常处理 (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");}
    }
    
  3. 日志处理 (Logging):

    • Logback、Log4j2 等日志框架的 Appender 机制。
  4. 审批流程 (Approval Workflow):

    • OA 系统、工作流引擎。
  5. 事件处理 (Event Handling):

    • 自定义事件处理链。
  6. 数据校验 (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;}}
    
  7. Spring Cloud Gateway 的 Filter:

    • Spring Cloud Gateway 使用责任链模式来处理请求。
    • 可以自定义 Filter,实现各种功能,例如:
      • 身份验证
      • 请求限流
      • 请求转发
      • 请求日志

总结:

责任链模式是一种非常实用的设计模式,在 Spring Boot 项目中有很多应用场景。 Spring 框架本身也大量使用了责任链模式(例如,Servlet 过滤器、Spring Security、Spring MVC 拦截器)。


http://www.ppmy.cn/embedded/169999.html

相关文章

小米 SU7 Ultra:科技与性能的极致融合,FPC 隐匿的关键力量【新立电子】

在汽车行业向电动化、智能化转型的浪潮中&#xff0c;小米 SU7 Ultra 以其卓越的性能与前沿科技&#xff0c;强势闯入大众视野&#xff0c;成为众多车迷与科技爱好者瞩目的焦点。这款高性能电动跑车&#xff0c;不仅在动力、操控等方面展现出超凡实力&#xff0c;其内部复杂精妙…

Leetcode 206 -反转链表

Leetcode 206: 反转链表 这是一道非常经典的链表操作题目&#xff0c;要求熟练掌握链表的遍历与指针操作。反转链表是面试中经常出现的题目之一&#xff0c;也是链表题目的基本方法题。 题目描述 输入&#xff1a;一个链表的头节点 head。输出&#xff1a;反转后的链表&#…

使用通义万相Wan2.1进行视频生成

使用通义万相Wan2.1进行视频生成 源代码准备运行环境准备创建Python虚拟环境并激活安装依赖包 模型下载生成视频官网的视频生成例子简单描述场景视频生成示例详细描述场景视频生成示例 最近通义万相开源了其视频生成模型。模型有两个版本&#xff0c;一个是1.3B的&#xff0c;一…

使用Docker Compose部署 MySQL8

MySQL 8 是一个功能强大的关系型数据库管理系统,而 Docker 则是一个流行的容器化平台。结合使用它们可以极大地简化 MySQL 8 的部署过程,并且确保开发环境和生产环境的一致性。 安装 Docker 和 Docker Compose 首先,确保你的机器上已经安装了 Docker 和 Docker Compose。 …

FPGA的ram Xilinx的IP Block Memory Generator

做过设计的对memory都比较熟悉了&#xff0c;在Asic设计中通常是rom&#xff0c;ram&#xff0c;那这些rom&#xff0c;ram在FPGA的模式下面怎么做呢&#xff0c;有两种方法&#xff0c;一种就是自己写代码&#xff0c;用寄存器去搭&#xff0c;搭好后需要指定综合成block ram&…

【Spark+Hive】基于Spark大数据技术小红书舆情分析可视化预测系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目目标 三、算法介绍 四、开发技术介绍 五、项目创新点 六、项目展示 七、权威教学视频 源码获取方式在文章末尾 一、项目背景 在数字经济蓬勃发展的当下&#xff0c;社交电商平台小红书凭借其"内容电商"的独特模式&#xff0c;已…

Docker相关知识

Docker 如今已经应用到软件开发中很多地方&#xff0c;有必要了解一下其相关知识&#xff0c; 什么是docker&#xff1f;docker是一款可以将我们目标应用程序和该程序运行所需的配置和依赖库等环境信息打包成镜像并运行的软件工具&#xff1b; 什么是基础镜像&#xff1f;它只…

C++核心编程之文件操作

C核心编程之文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放。因此&#xff0c;我们需要通过文件来将数据持久化&#xff0c;能够有效地将数据保存到本地电脑某个地方。 C中对文件操作需要包含头文件#include<fstream> 文件类型分为…