责任链模式详解和在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 拦截器)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值