这边帖子的主要思路来自于马士兵老师的设计模式课程。
这边模拟了tomcat的filter,代码如下。
1、首先定义一个Filter接口
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public interface Filter {
public void doFilter(Request request, Response response, FilterChain chain);
}
2、定义FilterChain,用来保存filter实例
package com.wry.chain;
import java.util.ArrayList;
import java.util.List;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class FilterChain implements Filter {
List<Filter> list = new ArrayList<>();
int index;
public void addFilter(Filter f) {
list.add(f);
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if (index == list.size()) {
new Servlet().doService(request, response);
return;
}
Filter f = list.get(index);
index++;
f.doFilter(request, response, chain);
}
}
3、加入两个filter实例
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class FilterOne implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("第一个过滤器开始");
chain.doFilter(request, response, chain);
System.out.println("第一个过滤器结束");
}
}
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class FilterTwo implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("第二个过滤器开始");
chain.doFilter(request, response, chain);
System.out.println("第二个过滤器结束");
}
}
4、请求对象和响应对象
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class Request {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class Response {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
5、Servlet对象
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class Servlet {
public void doService(Request request, Response response) {
System.out.println("请求接收信息:" + request.getStr());
response.setStr("服务器端发送信息");
}
}
其中request,response,servlet都只是以最简单的方式模拟了一下
6、测试程序
package com.wry.chain;
/**
* @author rongyao wen
* @date 2018/7/30
*/
public class Main {
public static void main(String args[]) {
Request request = new Request();
request.setStr("请求数据");
Response response = new Response();
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FilterOne());
filterChain.addFilter(new FilterTwo());
filterChain.doFilter(request, response, filterChain);
System.out.print("客户端接收服务器端:" + response.getStr());
}
}
7、结果如下
8、sequence图调用详细图如下示