c#设计模式
59.08元
(需用券)
去购买 >
过滤器模式,顾名思义,就是过滤对象用的,对需要过滤的对象,进行一些验证,或者加某些特定信息,或者删减信息都可以。如果你想定义多个过滤规则,那么就需要定义多个过滤器,一般每个过滤器只实现一种规则。然后多个过滤器会连在一起,形成一个过滤器链,想想我们的servlet的过滤器,其实就是这样的,下面我就根据servlet过滤器实现方式,来模拟一下过滤器的模式:
1、首先定义两个需要过滤的对象,
Request:
packagecom.hd.filter;public classRequest {privateString requestStr;publicRequest(String requestStr) {this.requestStr =requestStr;
}publicString getRequestStr() {returnrequestStr;
}public voidsetRequestStr(String requestStr) {this.requestStr =requestStr;
}public voidaddStr(String str){this.requestStr +=str;
}
}
Response:
packagecom.hd.filter;public classResponse {privateString ResponseStr;publicResponse(String responseStr) {
ResponseStr=responseStr;
}publicString getResponseStr() {returnResponseStr;
}public voidsetResponseStr(String responseStr) {
ResponseStr=responseStr;
}public voidaddStr(String str){this.ResponseStr +=str;
}
}
2、然后需要定义一个filter接口:
packagecom.hd.filter;public interfaceFilter {voiddoFilter(Request request, Response response, FilterChain filterChain);
}
3、接着我们再定义一个过滤器链FilterChain,用来将多个过滤器有序的链起来:
packagecom.hd.filter;importjava.util.ArrayList;importjava.util.List;public classFilterChain {private List filterChains = new ArrayList();public staticFilterChain build(){return newFilterChain();
}publicFilterChain addFilter(Filter filter){this.filterChains.add(filter);return this;
}publicFilterChain removeFilter(Filter filter){this.filterChains.remove(filter);return this;
}
}
4、下面就是定义具体的filter实现了:
packagecom.hd.filter;public class HTMLFilter implementsFilter {
@Overridepublic voiddoFilter(Request request, Response response, FilterChain filterChain) {
System.out.println("HTMLFilter Request");
request.addStr("-HTML-");
filterChain.doFilter(request, response);//这里是第一个重点的地方,只有这样设计,request才可以按照正序执行过滤,response按照倒序执行过滤
response.addStr("-HTML-");
System.out.println("HTMLFilter Response");
}
}
packagecom.hd.filter;public class SensitiveFilter implementsFilter {
@Overridepublic voiddoFilter(Request request, Response response, FilterChain filterChain) {
System.out.println("SensitiveFilter Request");
request.addStr("-Sensitive-");
filterChain.doFilter(request, response);
response.addStr("-Sensitive-");
System.out.println("SensitiveFilter Response");
}
}
packagecom.hd.filter;public class LowerUpcaseFilter implementsFilter {
@Overridepublic voiddoFilter(Request request, Response response, FilterChain filterChain) {
System.out.println("LowerUpcaseFilter Request");
request.addStr("-LowerUpcase-");
filterChain.doFilter(request, response);
response.addStr("-LowerUpcase-");
System.out.println("LowerUpcaseFilter Response");
}
}
5、下面我们还差一个重要的点,就是如何把所有的过滤器串起来,还按照顺序往下执行。如果你有经过思考后的话,不难想到应该是在FilterChain的 doFilter 方法里做文章:
private int index =0;public voiddoFilter(Request request, Response response){if(index
filterChains.get(index++).doFilter(request, response, this);
}else{return;
}
}
定义一个变量,用来标记当前需要处理的是哪个过滤器,这是第二个重点。
6、最后写下测试代码:
packagecom.hd.filter;public classTestFilter {public static voidmain(String[] args){
FilterChain filterChain=FilterChain.build();
filterChain.addFilter(newHTMLFilter());
filterChain.addFilter(newSensitiveFilter());
filterChain.addFilter(newLowerUpcaseFilter());
Request request= new Request("request");
Response response= new Response("response");
filterChain.doFilter(request, response);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
运行结果如下:
HTMLFilter Request
SensitiveFilter Request
LowerUpcaseFilter Request
LowerUpcaseFilter Response
SensitiveFilter Response
HTMLFilter Response
request-HTML--Sensitive--LowerUpcase-response-LowerUpcase--Sensitive--HTML-
如果你写过递归算法的话,应该会和我有同感,感觉过滤器有点像递归算法,一层层的往下套,然后执行到最后一层的之后,再一个个原路返回。
过滤器在spring中也有重点运用,AOP切面的实现方式就用到了过滤器模式,后面有机会我会介绍的。
未完待续。。。
原文链接:https://www.cnblogs.com/xiexin2015/p/9037865.html
java 11官方入门(第8版)教材
79.84元
包邮
(需用券)
去购买 >