职责链模式在开源代码中的应用

2020-08-19

职责链模式的作用:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。

 

案例一

servlet 2.3 版新增了 Filter 和 FilterChain,其中 FilterChain 就是用了职责链模式。

Filter 用于在 Servlet 响应前,进行预处理、信息校验等,Filter 没有调用 doFilter 方法参数中 chain 的 doFilter 方法,调用链即停止 

public interface Filter {
    
    public void init(FilterConfig filterConfig) throws ServletException;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    public void destroy();
}

 

FilterChain 接口中只有一个方法 doFilter,用于控制下一个 Filter 的方法被调用

public interface FilterChain {
    public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
}


看下 FilterChain 的简单实现

private static class VirtualFilterChain implements FilterChain {

    private final FilterChain originalChain;

    private final List<? extends Filter> additionalFilters;

    private int currentPosition = 0;

    public VirtualFilterChain(FilterChain chain, List<? extends Filter> additionalFilters) {
        this.originalChain = chain;
        this.additionalFilters = additionalFilters;
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response)
            throws IOException, ServletException {

        if (this.currentPosition == this.additionalFilters.size()) {
            this.originalChain.doFilter(request, response);
        }
        else {
            this.currentPosition++;
            Filter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
            nextFilter.doFilter(request, response, this);
        }
    }
}

 


案例二

ConstXiong 备案号:苏ICP备16009629号-3