标签:
使用场景:
现在有如下字符 :) English < > ,现在想把其转换为 ^V^ 英文 [],并且根据要求对 :) English < >这个三类分别转换
解决办法:
(1)if else进行处理
(2)定义一个Filter接口,然后在定义三个实现Filter的类,根据具体的需求定义一个FilterChain。类图如下:
//注意:addFilter(Filter)返回值是 FilterChain,这是为了方便后面的链式编程

场景:如果实现Filter接口的多个类要组合成一个整体使用。
解决办法:将这几个类组合成为一个FilterChian,同时FilterChain继承Filter接口
具体代码:
//Filter接口
public interface Filter {
   String doFilter(String str);
}
//实现Filter接口的类
public class EnglishFilter implements Filter {
   public String doFilter(String str) {
      String r = str.replace("English", "英文");
      return r;
   }
}
public class FaceFilter implements Filter {
   public String doFilter(String str) {
      return str.replace(":)", "^V^");
   }
}
public class HTMLFilter implements Filter {
   public String doFilter(String str) {
      String r = str.replace(‘<‘, ‘[‘)
               .replace(‘>‘, ‘]‘);
      return r;
   }
}
//FilterChain(对FilterChain中的Filter以此进行处理)
public class FilterChain implements Filter {
   List<Filter> filters = new ArrayList<Filter>();
   
   public FilterChain addFilter(Filter f) {
      this.filters.add(f);
      return this;
   }
   
   public String doFilter(String str) {
      String r = str;
      for(Filter f: filters) {
         r = f.doFilter(r);
      }
      return r;
   }
}
//处理流程的分装,只需要传入处理的数据,和调用的FilterChain
public class MsgProcessor {
    
   //省略setter,getter方法
   private String msg;
   FilterChain fc;
   
   public String process() {
      return fc.doFilter(msg);
   }
}
//测试方法
public static void main(String[] args) {
   //需要处理的数据
   String msg = ":) English < >";
   //定义初始化处理的方法
   MsgProcessor mp = new MsgProcessor();
   //传入数据
   mp.setMsg(msg);
   //定义初始化FilterChain
   FilterChain fc = new FilterChain();
   //这里便是addFilter(Filter)返回值是 FilterChain好处
   fc.addFilter(new HTMLFilter())
     .addFilter(new EnglishFilter());
   FilterChain fc2 = new FilterChain();
   fc2.addFilter(new FaceFilter());
   //将这几个实现Filter接口的类组合成为一个FilterChian,添加到另一个FilterChain中
   fc.addFilter(fc2);
   //传入FilterChain
   mp.setFc(fc);
   String result = mp.process();
   System.out.println(result);
}
上面只是一个简单的Filter,对于web中request和response都需要拦截的拦截器该如何编写呢?
注意区别:上面的是一条直链
 web中的链条还要折回来,并且response处理的顺序和request的顺序相反。
解决办法:doFilter(request,response,filterChain),多加一个filterChain参数
标签:
原文地址:http://my.oschina.net/u/2361475/blog/506444