使用场景:
现在有如下字符 :) 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