源码解析
在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);
}
}