使用一个责任链实现
请求的request执行责任链的顺序是filter01、filter02
返回的response执行责任链的顺序是filter02、filter01
import java.util.ArrayList;
import java.util.List;
public class TwoWayChainPattern {
/**
* 使用一个责任链实现
* 请求的request执行责任链的顺序是filter01、filter02
* 返回的response执行责任链的顺序是filter02、filter01
* @param args
*/
public static void main(String[] args) {
Request request = new Request();
request.req = "Request:";
Response response = new Response();
response.res = "Response:";
ChainFilter chainFilter = new ChainFilter();
chainFilter.add(new Filter01()).add(new Filter02());
chainFilter.doFilter(request, response);
System.out.println(request.req);
System.out.println(response.res);
}
}
interface Filter{
boolean doFilter(Request request, Response response, ChainFilter chainFilter);
}
class ChainFilter{
List<Filter> filterList= new ArrayList<>();
// 用来控制该执行第几个Filter
int index = 0;
public ChainFilter add(Filter filter){
filterList.add(filter);
return this;
}
public boolean doFilter(Request request, Response response){
// 如果index等于了链表长度,则证明request已全部执行完
if (index == filterList.size()) return false;
// 获取第index个filter让request执行
Filter filter = filterList.get(index);
index ++;
// 找到第index个Filter并执行
return filter.doFilter(request, response, this);
}
}
class Filter01 implements Filter{
@Override
public boolean doFilter(Request request, Response response, ChainFilter chainFilter) {
String filter01 = "filter01->";
request.req = request.req + filter01;
chainFilter.doFilter(request, response); // 又这行可以根据请求的执行顺序,控制了返回的逆向执行顺序
response.res = response.res + filter01;
return false;
}
}
class Filter02 implements Filter{
@Override
public boolean doFilter(Request request, Response response, ChainFilter chainFilter) {
String filter02 = "Filter02->";
request.req = request.req + filter02;
chainFilter.doFilter(request, response);
response.res = response.res + filter02;
return false;
}
}
class Request{
String req;
}
class Response{
String res;
}