责任链模式处理request和response的消息(模拟Tomcat里面的Filter过滤器)
(1)创建一个WebFilter接口
package com.alan.chainOfResponsibility.web;
public interface WebFilter {
void doFilter(Request request,Response response,FilterChain chain) ;
}
(2)创建这个接口的实现类
package com.alan.chainOfResponsibility.web;
public class HtmlFilter implements WebFilter{
//既可以处理客户端到服务器的消息,也可以处理服务器到客户端的消息,双向处理
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.setRequestStr(request.getRequestStr().replaceAll("<", "{").replaceAll(">", "}")+"-htmlFilter") ;
chain.doFilter(request, response, chain) ;
response.setResponseStr(response.getResponseStr().replaceAll("<", "{").replaceAll(">", "}")+"-htmlFilter") ;
}
}
package com.alan.chainOfResponsibility.web;
public class SensitiveFilter implements WebFilter{
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
// TODO Auto-generated method stub
request.setRequestStr(request.getRequestStr().replaceAll("尼玛的", "亲爱的")+"-sensitiveFilter") ;
chain.doFilter(request, response, chain) ;
response.setResponseStr(response.getResponseStr().replaceAll("尼玛的","亲爱的"+"-sensitiveFilter")) ;
}
}
(3)创建过滤器链
package com.alan.chainOfResponsibility.web;
import java.util.ArrayList;
import java.util.List;
public class FilterChain implements WebFilter{
private List<WebFilter> filters = new ArrayList<WebFilter>() ;
private int index =0;
//添加过滤器
public void addFilter(WebFilter filter){
this.filters.add(filter) ;
}
//递归调用
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
if(index < chain.getFilters().size()){
//得到一个当前的filter
WebFilter currentFilter = filters.get(index) ;
index++ ;
currentFilter.doFilter(request, response, chain) ;
}
}
public List<WebFilter> getFilters() {
return filters;
}
public void setFilters(List<WebFilter> filters) {
this.filters = filters;
}
}
(4)模拟Request
package com.alan.chainOfResponsibility.web;
public class Request {
private String requestStr ;
public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
(5)模拟Response
package com.alan.chainOfResponsibility.web;
public class Response {
private String responseStr ;
public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
(6)创建测试类:Client
package com.alan.chainOfResponsibility.web;
/*
*
* 双向的过滤器
*/
public class Client {
public static void main(String[] args) {
//构建客户端请求
Request request = new Request() ;
request.setRequestStr("尼玛的,<html>我是客户端的请求信息</html>") ;
//构建服务器响应
Response response = new Response() ;
response.setResponseStr("尼玛的<html>我是服务器的响应信息</html>") ;
FilterChain chain = new FilterChain() ;
chain.addFilter(new HtmlFilter()) ;
chain.addFilter(new SensitiveFilter()) ;
chain.doFilter(request, response, chain) ;
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
运行届结果:
亲爱的,{html}我是客户端的请求信息{/html}-htmlFilter-sensitiveFilter(request的消息过滤结果)
亲爱的-sensitiveFilter{html}我是服务器的响应信息{/html}-htmlFilter(response的消息过滤结果)
结构图: