当前位置: 首页 > news >正文

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

责任链模式详解

1. 定义:

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

2. 结构:

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

3. 工作流程:

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

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

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

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

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

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

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

总结:

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

相关文章:

  • 软开经验总结
  • 【C语言】联合体 `union` 的妙用
  • 第十五届蓝桥杯:dfs之数字接龙
  • 深入解析雪花算法(Snowflake):分布式唯一ID的优雅解决方案
  • 1、CI/CD 平台安装部署(Gitlab+Jenkins)
  • 10个常见的Java面试问题及其答案
  • 嵌入式学习前要了解的基础知识
  • PPP协议
  • nextjs+material UI实现换肤功能
  • 数据集/API 笔记:湿球黑球温度(WBGT)观测数据
  • Linux cat 命令
  • JavaWeb-idea配置smart tomcat
  • Java设计模式 —— 【行为型模式】迭代器模式(Iterator Pattern)详解
  • 我的ChatGPT怎么登不上?
  • CentOS7安装 FFmpeg
  • Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks
  • Spring Boot 监听器(Listeners)详细教程
  • 2024华为OD机试真题-热点网站统计(C++)-E卷-100分
  • AVM 环视拼接 鱼眼相机
  • 离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用
  • 巴基斯坦外长:印巴停火
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 人民日报整版调查:中小学春秋假,如何放得好推得开?
  • 常州市委原常委、组织部部长陈翔调任江苏省民宗委副主任
  • 圆桌丨中俄权威专家详解:两国携手维护战后国际秩序,捍卫国际公平正义