public interface Filter {
void doFilter(Request request,Response response,FilterChain filterChain);
}
public interface FilterChain{
void add(Filter filter);
void doFilter(Request request,Response response);
}
public class FilterChainImpl implements FilterChain {
ArrayList<Filter> list = new ArrayList<Filter>();
private int index = 0;
@Override
public void add(Filter filter){
list.add(filter);
}
@Override
public void doFilter(Request request, Response response) {
if(index < list.size())
list.get(index++).doFilter(request,response,this);
}
}
public class FilterImpl1 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain){
doFilterForRequest(request);
filterChain.doFilter(request,response);
doFilterForResponse(response);
}
private void doFilterForRequest(Request request){
System.out.println("request1");
}
private void doFilterForResponse(Response response){
System.out.println("response1");
}
}
public class FilterImpl2 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain){
doFilterForRequest(request);
filterChain.doFilter(request,response);
doFilterForResponse(response);
}
private void doFilterForRequest(Request request){
System.out.println("request2");
}
private void doFilterForResponse(Response response){
System.out.println("response2");
}
}
public interface Request {
}
public interface Response {
}
public class Main {
public static void main(String[] args) {
FilterChain filterChain = new FilterChainImpl();
filterChain.add(new FilterImpl1());
filterChain.add(new FilterImpl2());
filterChain.doFilter(new RequestImpl(),new ResponseImpl());
}
}
class RequestImpl implements Request{
}
class ResponseImpl implements Response{
}