责任链设计模式实战系列(一)

前言

  1. 这个系列主要讲优秀的开源框架对于责任链这个设计模式的运用,对于好的设计,我们关键是学习他的思想并运用在我们的编码中。

  2. 这个系列的所有代码都是我根据源码提炼之后的代码,不依赖原项目或框架,可以直接跑。

  3. 我不会讲每个具体是如何实现的,如果你觉得光看代码比较吃力,那么可以将代码复制下来,自己多运行几遍,我相信你一定能掌握。

  4. 欢迎访问我的个人网站,里面有超多开源组件和项目,另外还有付费项目和博客,地址:https://openbytecode.com/

  5. 本小节是这个系列第一篇,主要讲责任链设计模式在 Tomcat 的 Filter 中的运用。

  6. 本系列 Github 地址:https://github.com/lijunping365/Open-Design

Tomcat 之 Filter

public interface Filter {

    void doFilter(HttpRequest request, HttpResponse response, FilterChain chain);
}
public interface FilterChain {

    void addFilter(Filter filter);

    /**
     * 回调入口
     * @param request
     * @param response
     */
    void doFilter(HttpRequest request, HttpResponse response);
}

下面两个可以当作 HttpServletRequest 和 HttpServletResponse 来理解

public class HttpRequest {
}
public class HttpResponse {
}

Filter 的默认实现

public class DefaultFilter implements Filter{


    @Override
    public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
        System.out.println("DefaultFilter ................Before");
        chain.doFilter(request, response);
        System.out.println("DefaultFilter ................After");
    }
}

这个类是核心

public class DefaultFilterChain implements FilterChain{

    private static final Integer CAP = 10;

    private Filter[] filters = new Filter[CAP];// 初始化大小

    private int pos;// 当前 Filter

    private int n;// 当前 filter length

    @Override
    public void addFilter(Filter filter) {
        if (n == filters.length){
            Filter[] newFilters = new Filter[n + CAP];
            System.arraycopy(this.filters, 0, newFilters, 0, this.filters.length);
            filters = newFilters;
        }
        filters[n++] = filter;
    }

    @Override
    public void doFilter(HttpRequest request, HttpResponse response) {
        if (pos < n){
            final Filter filter = filters[pos++];
            filter.doFilter(request, response, this);
        }
    }
}

测试

public class FirstFilter implements Filter {
    @Override
    public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
        System.out.println("FirstFilter ................Before");
        chain.doFilter(request, response);
        System.out.println("FirstFilter ................After");
    }
}
public class SecondFilter implements Filter {
    @Override
    public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
        System.out.println("SecondFilter ................Before");
        chain.doFilter(request, response);
        System.out.println("SecondFilter ................After");
    }
}
public class ThirdFilter implements Filter {
    @Override
    public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
        System.out.println("ThirdFilter ................Before");
        chain.doFilter(request, response);
        System.out.println("ThirdFilter ................After");
    }
}
public class FilterTest {

    public static void main(String[] args) {
        DefaultFilterChain filterChain = new DefaultFilterChain();

        filterChain.addFilter(new FirstFilter());
        filterChain.addFilter(new SecondFilter());
        filterChain.addFilter(new ThirdFilter());
        filterChain.doFilter(new HttpRequest(), new HttpResponse());

    }
}

输出结果


FirstFilter ................Before
SecondFilter ................Before
ThirdFilter ................Before
ThirdFilter ................After
SecondFilter ................After
FirstFilter ................After

欢迎在评论区留下你的总结,一起交流探讨

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值