源码解析——FilterChain是职责链(过滤器)模式的典型应用

源码解析

在javaWeb应用开发中,FilterChain是职责链(过滤器)模式的典型应用,以下是Filter的模拟实现分析:

Request.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Request
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public interface Request {
}

Response.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Response
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public interface Response {
}

Filter.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Filter
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public interface Filter {
    public void doFilter(Request req,Response res,FilterChain c);
}

FilterChain.java

package com.itheima.pattern.responsibility.jdk;

import java.util.ArrayList;
import java.util.List;

/**
 * @version v1.0
 * @ClassName: FilterChain
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class FilterChain { //过滤器链

    private List<Filter> filters = new ArrayList<Filter>();

    private int index = 0;

    // 链式调用
    public FilterChain addFilter(Filter filter) {
        this.filters.add(filter);
        return this;
    }

    public void doFilter(Request request, Response response) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, this);
    }
}

FirstFilter.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: FirstFilter
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class FirstFilter implements Filter {
    public void doFilter(Request req, Response res, FilterChain chain) {
        System.out.println("过滤器1 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(req, res);

        System.out.println("过滤器1 后置处理");
    }
}

SecondFilter.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: FirstFilter
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class SecondFilter implements Filter {
    public void doFilter(Request req, Response res, FilterChain chain) {
        System.out.println("过滤器2 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(req, res);

        System.out.println("过滤器2 后置处理");
    }
}

Client.java

package com.itheima.pattern.responsibility.jdk;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class Client {
    public static void main(String[] args) {
        Request  req = null;
        Response res = null ;

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
        filterChain.doFilter(req,res);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39368007/article/details/114065579