责任链,如同名字一样,一条链子,是有一环套一环的,没一个环就相当于一个处理器,处理完后交给下一个处理器处理,只到所有的处理器都处理完,如果我们有过web开发经验的人,看到这个比如就会联想到Filter和interceptor这两个概念,就是过滤器和拦截器,现在我们将模拟过滤器来讲解责任模式,
1、写一个Filter接口(这个接口是我自定义的,并非Servlet中的那个Filter)
public interface Filter
{
public void doFilter(Request request,Response response,FilterChain chain);
}
2、写一个Request,Response类,分别模式web编程总的两个类,相信你懂 的!
public class Request
{
//定义一个简单的字符串
private String requestStr;
public String getRequestStr()
{
return requestStr;
}
public void setRequestStr(String requestStr)
{
this.requestStr = requestStr;
}
}
public class Response
{
private String responseStr;
public String getResponseStr()
{
return responseStr;
}
public void setResponseStr(String responseStr)
{
this.responseStr = responseStr;
}
}
3、编写一个处理"<>"的Filter,将内容的"<>"变为"[]",一个处理敏感信息的Filter
public class HtmlFilter implements Filter
{
@Override
public void doFilter(Request request, Response response, FilterChain chain)
{
// TODO Auto-generated method stub
//将Request中的字符串中的<>变为[]
request.setRequestStr(request.getRequestStr().replace(">", "]"));
request.setRequestStr(request.getRequestStr().replace("<", "["));
//标记一个被这个Filter处理过
request.setRequestStr(request.getRequestStr()+"---html");
chain.doFilter(request, response, chain);
//将Response中的字符串中的<>变为[]
response.setResponseStr(response.getResponseStr().replace("<", "["));
response.setResponseStr(response.getResponseStr().replace(">", "]"));
//同上
response.setResponseStr(response.getResponseStr()+"---html");
}
}
public class SenFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { // TODO Auto-generated method stub request.getRequestStr().replace("敏感", "^V^"); request.setRequestStr(request.getRequestStr()+"--sen"); chain.doFilter(request, response, chain); response.getResponseStr().replace("敏感", "^V^"); response.setResponseStr(response.getResponseStr()+"--sen"); } }
4、编写一个链子,里面保存所有的Filter,并自身实现了Filter接口public class FilterChain implements Filter { private List<Filter> filters=new ArrayList<Filter>(); private int now=-1; @Override public void doFilter(Request request, Response response, FilterChain chain) { // TODO Auto-generated method stub now++; if(now<=filters.size()-1) filters.get(now).doFilter(request, response, chain); else return; } //增加Filter public void addFilter(Filter filter) { filters.add(filter); } //删除Filter public void removeFilter(Filter filter) { filters.remove(filter); } }
5、测试public class Test { public static void main(String[] args) { FilterChain chain=new FilterChain(); chain.addFilter(new HtmlFilter()); chain.addFilter(new SenFilter()); String str1="<Hello>,你是谁?怎么到我房间里面来了?"; String str2="<haha>,我是小偷"; Request request=new Request(); request.setRequestStr(str1); Response response=new Response(); response.setResponseStr(str2); chain.doFilter(request, response, chain); System.out.println(request.getRequestStr()); System.out.println(response.getResponseStr()); } }