责任链模式-解析与示例

责任链模式(Chain of Responsibility Pattern)是一种常用的设计模式,它可以将发送者的请求沿着一条链传递,直到有一个对象来处理这个请求为止。在Spring Boot应用程序中,责任链模式经常用来处理如HTTP请求、日志记录、权限校验等流程。

一个典型的使用场景是Spring Security中对HTTP请求进行安全校验的过程,多个安全过滤器形成一条链,逐级对请求进行处理。下面我将通过一个简化的例子来展示如何在Spring Boot中实现一个责任链模式。

假设我们有一个处理用户请求的简单责任链,分为三个环节:

  1. 验证请求的合法性(AuthCheckHandler)
  2. 增加请求日志(LogHandler)
  3. 实际业务处理(BusinessHandler)

首先,定义处理器的接口:

public interface Handler {
    void setNext(Handler nextHandler);
    void handle(Request request);
}

然后,实现每个具体的处理器类,比如权限校验处理器:

public class AuthCheckHandler implements Handler {
    private Handler nextHandler;

    @Override
    public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Request request) {
        // 模拟权限校验的逻辑,若校验失败则不再传递请求
        if (request.getUser().hasValidCredentials()) {
            System.out.println("用户验证通过。");
            if (nextHandler != null) {
                nextHandler.handle(request);
            }
        } else {
            System.out.println("用户验证失败!");
        }
    }
}

日志处理器:

public class LogHandler implements Handler {
    private Handler nextHandler;

    @Override
    public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Request request) {
        // 在这里添加日志逻辑
        System.out.println("请求被记录在日志中。");
        if (nextHandler != null) {
            nextHandler.handle(request);
        }
    }
}

业务处理器:

public class BusinessHandler implements Handler {
    private Handler nextHandler;

    @Override
    public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Request request) {
        // 实际业务逻辑
        System.out.println("请求被业务处理器处理。");
        if (nextHandler != null) {
            nextHandler.handle(request);
        }
    }
}

最后,在Spring Boot应用中组合这些处理器,创建责任链:

@Component
public class HandlerChain {

    @Autowired
    private AuthCheckHandler authCheckHandler;

    @Autowired
    private LogHandler logHandler;

    @Autowired
    private BusinessHandler businessHandler;

    // 创建责任链
    public Handler getChain() {
        authCheckHandler.setNext(logHandler);
        logHandler.setNext(businessHandler);
        // 以权限校验处理器为起点返回责任链
        return authCheckHandler;
    }
}

使用时,我们只需要引入HandlerChain组件,然后调用getChain()方法获取责任链,并调用链的头部处理器处理请求即可:

@RestController
public class MyController {

    @Autowired
    private HandlerChain handlerChain;

    @GetMapping("/handle")
    public ResponseEntity<String> handleRequest() {
        // 创建请求对象
        Request request = new Request(new User("username", "password"));
        // 获取责任链并处理请求
        handlerChain.getChain().handle(request);

        return ResponseEntity.ok("请求处理完成");
    }
}

优点

提高代码的灵活性,易于扩展新的处理者。
解耦请求的发送者和接收者,降低耦合度。
方便在不同对象之间传递请求。

缺点

可能会降低性能,因为每个处理者都需要检查请求是否符合自己的处理条件。
责任链的维护可能会比较复杂,需要考虑所有处理者的处理顺序。

总结

这个例子非常简化,具体情况会根据实际业务需要做出相应的调整和完善。此外,在 Spring 框架中,很多已有的组件比如FilterInterceptor等已经形成了一个责任链,可以通过配置文件或注解的方式灵活组合。


在这里插入图片描述

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

源梦倩影

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

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

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

打赏作者

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

抵扣说明:

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

余额充值