责任链设计模式(Chain of Responsibility)定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
应用有:Java Web中的过滤器链、springmvc中的拦截器链,Struts2中的拦截器栈等。
下面就运用责任链设计模式来模拟客户端------服务器端的request,response过程中拦截处理过程:
问题:给定字符串 Steing mes="小谢,来自云南腾冲,自称是个傻叉,非常的<,>{},优秀";
要求在request请求时候,要求先修改其中符号“{”为“^^^”,在修改其中“傻叉”为“天才”;
在response时,反过来,先替换“傻叉”为“天才一个”再修改符号;形成一个闭环链,如若要添加其他修改,只要添加一个修改链就行。
直接上代码:
先定义一个filter接口,
/**
* 可以定义一系列的规则
* @author lenovo
*
*/
public interface Filter {
void doFilter(Request request,Response reponse,FilterChain chain);
}
然后定义一个request和一个response:
package com.jiang;
public class Request {
String requestStr;
public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
package com.jiang;
public class Response {
String responseStr;
public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
然后定义一个FilterChain 实现Filter,用于控制拦截逻辑,也是责任链模式的最重要体现:
package com.jiang;
import java.util.ArrayList;
import java.util.List;
public class FilterChain implements Filter{
List<Filter>filters=new ArrayList<Filter>();
int index=0;
public FilterChain addFilter(Filter f){
this.filters.add(f);
return this;
}
@Override
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);
}
}
然后定义修改字符串的一个类StringFilter实现Filter接口,定义一个修改符号的类HTMLFilter实现Filter接口:
package com.jiang;
public class StringFilter implements Filter{
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.requestStr=request.requestStr.replace("傻叉", "天才")+"StringFilter----";
chain.doFilter(request, response, chain);
response.responseStr=response.responseStr.replace("傻叉", "天才一个response");
}
}
package com.jiang;
public class HTMLFilter implements Filter{
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.requestStr=request.requestStr.replace(">", "]")+"HTML----";
chain.doFilter(request, response, chain);
response.responseStr=response.responseStr.replace("{", "^^^response");
}
}
最后测试类:
package com.jiang;
public class MainTest {
public static void main(String[] args) {
String mes="小谢,来自云南腾冲,自称是个傻叉,非常的<,>{},优秀";
Request request=new Request();
request.setRequestStr(mes);
Response response=new Response();
response.setResponseStr(request.getRequestStr());
FilterChain fc=new FilterChain();
fc.addFilter(new HTMLFilter()).addFilter(new StringFilter());
//FilterChain fc2=new FilterChain();
//fc2.addFilter(new StringFilter());
fc.doFilter(request, response,fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}