常用设计模式-责任链模式(二)

本文通过分析Servlet中的Filter应用,深入探讨责任链模式。我们将模拟Filter的执行流程,实现请求从A到B到C再到B最后返回到A的顺序。通过创建Filter接口、FilterChain以及各个Filter实现类,演示如何运用责任链模式实现递归调用。
摘要由CSDN通过智能技术生成

责任链模式

承接上一篇内容常用设计模式-责任链模式

责任链模式在许多框架中都有很广泛的应用, 比如Servlet中的Filter, Netty中的Channel等, 我们模拟Servlet中的filter加深对责任链模式的理解, 实现请求从A->B->C->B->A的执行顺序。

码云地址地址:design_patterns

创建Filter接口

public interface Filter<T, R, E> {
    void doFilter(T t, R r, E e);
}

创建FileterChian

public interface FilterChain<T, R> {
    void doFilter(T t, R r);
}

public class ApplicationFilterChain implements FilterChain<Request, Response>{

    private final List<Filter<Request, Response, FilterChain<Request, Response>>> filters;
    private int index = 0;

    public ApplicationFilterChain(){
        filters = new ArrayList<>();
    }

    public ApplicationFilterChain setNextFilter(Filter<Request, Response, FilterChain<Request, Response>> nextFilter){
        if (!filters.contains(nextFilter)){
            filters.add(nextFilter);
        }
        return this;
    }

	
    @Override
    public void doFilter(Request request, Response response) {
        //执行下一个链方法
        if (index < filters.size()){
            filters.get(index++).doFilter(request, response, this);
        }
    }
}

创建Filter接口实现类, HttpFilter,SocketFilter,FileFilter

public class FileFilter implements Filter<Request, Response, FilterChain<Request, Response>>{
    @Override
    public void doFilter(Request request, Response response,  FilterChain<Request, Response> filterChain) {
        System.out.println("执行File拦截器");
        filterChain.doFilter(request, response);
        System.out.println("执行File2拦截器");
    }
}

public class HttpFilter implements Filter<Request, Response, FilterChain<Request, Response>>{
    @Override
    public void doFilter(Request request, Response response, FilterChain<Request, Response> filterChain) {
        System.out.println("执行Http拦截器");
        filterChain.doFilter(request, response);
        System.out.println("执行Http2拦截器");
    }
}

public class SocketFilter implements Filter<Request, Response, FilterChain<Request, Response>> {
    @Override
    public void doFilter(Request request, Response response, FilterChain<Request, Response> filterChain) {
        System.out.println("执行Socket拦截器");
        filterChain.doFilter(request, response);
        System.out.println("执行Socket2拦截器");
    }
}

执行测试

    public static void main(String[] args) {
        Request request = new Request();
        Response response = new Response();
        
        HttpFilter httpFilter = new HttpFilter();
        SocketFilter socketFilter = new SocketFilter();
        FileFilter fileFilter = new ApplicationFilterChain();
        
        FilterChain requestFilter = new FilterChain();
        requestFilter.setNextFilter(httpFilter)
                .setNextFilter(socketFilter)
                .setNextFilter(fileFilter);

        requestFilter.doFilter(request, response);
    }

执行结果

执行Http拦截器
执行Socket拦截器
执行File拦截器
执行File2拦截器
执行Socket2拦截器
执行Http2拦截器

可以看到核心思想为filter持有FilterChain的引用对象, FilterChain维护filter链。在filter子类实现中通过调用filterChain.doFilter(request, response)方法完成对FilterChain的递归调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值