责任链模式实现方式以及在业务中的运用

本文介绍了责任链模式的三种实现方式:基于数组遍历、FilterChain参数和链表构建处理器链,并通过实际代码展示了如何在业务中运用。讨论了Spring中的管道模式,以及在Netty和Tomcat中的应用。责任链模式提供了灵活的处理流程控制,适用于复杂业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在平常业务开发或者深入了解一些框架实现时,经常会看到责任链模式的运用。责任链模式,通俗来讲,是若干个处理器组成一条链,当收到请求时,依次经过每个处理器,每个处理器只负责单独的一块逻辑。实现责任链模式有很多种方式,我们由浅入深,共同来探讨如何来实现责任链模式。
考虑一个场景,当我们接受一个用户请求,需要先做登录验证、权限验证、业务验证等许多验证,然后再做业务处理。我们首先想到的是将登录、权限、业务这些验证抽象成一个个过滤器,类似于这样:

public interface Filter {
   
    void doFilter(Request request);
}

登录验证

public class LoginFilter implements Filter {
   
    @Override
    public void doFilter(Request request) {
   
        System.out.println("执行登录验证...");
    }
}

权限验证

public class AuthorityFilter implements Filter {
   
    @Override
    public void doFilter(Request request) {
   
        System.out.println("执行权限验证...");
    }
}

业务验证

public class BusinessFilter implements Filter {
   
    @Override
    public void doFilter(Request request) {
   
        System.out.println("执行业务验证...");
    }
}

然后用过滤器链组装所有的过滤器:

public class FilterChain implements Filter {
   
    private List<Filter> filters = new ArrayList<>();
 
    @Override
    public void doFilter(Request request) {
   
        filters.forEach(filter -> filter.doFilter(request));
    }
 
    public FilterChain addFilter(Filter filter) {
   
        filters.add(filter);
        return this;
    }
}

并且按照如下方式进行调用:

@org.junit.Test
public void test1() {
   
    com.example.filterchain.v1.FilterChain chain = new com.example.filterchain.v1.FilterChain();
    chain.addFilter(new com.example.filterchain.v1.LoginFilter())
         .addFilter(new com.example.filterchain.v1.AuthorityFilter())
         .addFilter(new com.example.filterchain.v1.BusinessFilter());
    chain.doFilter(new Request());
}

测试结果:
在这里插入图片描述
这种方式是基于数组遍历依次调用每个处理器的filter方法来实现各种验证,但是它有一些缺陷:

不能控制过滤器的执行,只能被动执行所有过滤器的处理逻辑
没有返回值,不能在过滤器中加入对返回值的修改
因此我们优化Filter接口及实现:

public interface Filter {
   
    void doFilter(Request request, Response response, FilterChain chain);
}
 
// 登录验证
public class LoginFilter implements Filter {
   
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
   
        System.out.println("执行登录验证...");
        chain.doFilter(request, response);
        System.out.println("登录-处理response...");
    }
}
 
// 权限验证
public class AuthorityFilter implements Filter {
   
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
   
        System.out.println("执行权限验证..."
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值