滤器模式(Filter Pattern)或标准模式(Criteria Pattern)允许开发人员使用不同的标准来过滤一组对象,这种类型的设计模式属于结构型模式。
Main
package com.dp.filter;
public class Main {
public static void main(String[] args) {
String msg = "hello:),敏感mingan大家好<h1>.";
Request request = new Request();
request.setRequestStr(msg);
Response response = new Response();
response.setResponseStr("response");
FilterChain fc1 = new FilterChain();
fc1.addFilter(new HTMLFilter()).addFilter(new FaceFilter());
FilterChain fc2 = new FilterChain(); //
fc2.addFilter(new SensitiveFilter()).addFilter(new FaceFilter());
fc1.addFilter(fc2);
/* 从输出结果来看还是存在一些问题
* 因为过滤器链传的是fc1,而此时fc1上只有有三个过滤器,最后一个过滤器(链)有两个过滤器但属于fc2
* 在request被SensitiveFilter过滤时出入的FilterChain为fc1过滤后返回到fc1结束
* fc2链上的只用了一个过滤器
*/
fc1.doFilter(request, response, fc1);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
/**
* hello^v^,萌萌大家好(h1). HTMLFilter FaceFilter SensitiveFilter
* response SensitiveFilter FaceFilter HTMLFilter
*/
Request
package com.dp.filter;
public class Request {
String requestStr;
public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
Response
package com.dp.filter;
public class Response {
String responseStr;
public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
Filter
package com.dp.filter;
import com.dp.filter.Request;
import com.dp.filter.Response;
/**
* 过滤器
* */
public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}
FilterChain
package com.dp.filter;
import java.util.ArrayList;
import java.util.List;
import com.dp.filter.Request;
import com.dp.filter.Response;
/**
* 过滤器链:一系列Filter
* */
public class FilterChain implements Filter{
private int index = 0;
private List<Filter> filters = new ArrayList<Filter>();
public FilterChain addFilter(Filter f) {
filters.add(f);
return this;
}
public void doFilter(Request request, Response response,FilterChain chain) {
if(index == filters.size()) return;
Filter f = filters.get(index); //对过滤器链上的过滤器进行调用
index++;
f.doFilter(request,response,chain);
}
}
FaceFilter
package com.dp.filter;
import com.dp.filter.Request;
import com.dp.filter.Response;
public class FaceFilter implements Filter {
public void doFilter(Request request, Response response,FilterChain chain) {
request.setRequestStr(request.getRequestStr().replace(":)","^v^")+" FaceFilter");
chain.doFilter(request, response, chain);
response.setResponseStr(response.getResponseStr()+" FaceFilter");
}
}
HTMLFilter
package com.dp.filter;
import com.dp.filter.Request;
import com.dp.filter.Response;
public class HTMLFilter implements Filter {
public void doFilter(Request request, Response response,FilterChain chain) {
request.setRequestStr(request.getRequestStr()
.replaceAll("<", "(").replaceAll(">",")")+" HTMLFilter");
chain.doFilter(request, response, chain); //过滤器链上的其他过滤器继续处理request
response.setResponseStr(response.getResponseStr()+" HTMLFilter");
}
}
SensitiveFilter
package com.dp.filter;
import com.dp.filter.Request;
import com.dp.filter.Response;
public class SensitiveFilter implements Filter {
public void doFilter(Request request, Response response,FilterChain chain) {
request.setRequestStr(request.getRequestStr()
.replaceAll("敏感", "萌萌").replaceAll("mingan", "")+" SensitiveFilter");
chain.doFilter(request, response, chain);
response.setResponseStr(response.getResponseStr()+" SensitiveFilter");
}
}