一、责任链模式的原理和作用

1、原理:如果有多个对象都有机会对信息进行处理,责任链会使发送者与接受者解耦,使请求沿着责任链传播,直到有对象处理它为止。

2、优势:对客户端到服务器、服务器到客户端的信息处理,同时使客户端与服务器之间完全解耦;可以减化对象,无需知道链的结构。

3、缺点:对性能有一定的损耗;请求不一定被处理。

二、请求的发送与处理的过程展示

1、图解

 

我们希望完成上图所示的操作,那么就有一个问题,假如我们的几个对象是对范围的限制,应该是这样一种考虑,客户端到服务器时,第一次最大,第二次次之,第三次最小,1   2  3针对这样的嵌套式的编程,那么服务器到客户端就是从1  2 到3因此,FilterChain里面的doFIlter方法是实现这个过程的重点。

2、代码示例:

//main方法

public class Main {
public static void main(String[] args){
String msg="大家好:),<script>,被就业," +
"网络授课没感觉,因为看不见大家伙";
Request request=new Request();
request.setRequestStr(msg);
Response response=new Response();
response.setResponseStr("response");

FilterChain fc=new FilterChain();

fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter()).
addFilter(new ReplaceFilter());
fc.doFilter(request, response,fc);

System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());

}

}

//Filter接口

public interface Filter {
//String doFilter(String str);
void doFilter(Request request,Response response,FilterChain chain);

}

//实现Filter,把HTMLFilter、SensitiveFilter、ReplaceFilter放入责任链FilterChain

public class FilterChain implements Filter{
List<Filter> filterlist=new ArrayList<Filter>();
int index=0;
public FilterChain addFilter(Filter f){
this.filterlist.add(f);
return this;
}
public void doFilter(Request request, Response response,FilterChain chain) {
if(index==filterlist.size())
return;
Filter f=filterlist.get(index);
index++;
f.doFilter(request, response, chain);

}

//HTMLFilter

public class HTMLFilter implements Filter{

public void doFilter(Request request, Response response,FilterChain chain) {
request.requestStr=request.requestStr.replace('<','[').replace('>', ']')
+"--HTML替换";
chain.doFilter(request, response, chain);
response.responseStr+="--HTMLFilter";
}

}

//SensitiveFilter

public class SensitiveFilter implements Filter{

@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.requestStr=request.requestStr.replace("被就业","就业").replace("敏感","")
+"--sensitiveFilter替换";
chain.doFilter(request, response, chain);
response.responseStr+="--sensitiveFilter";

}

}

//Request实体类

public class Request {
String requestStr;

public String getRequestStr() {
return requestStr;
}

public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}

}

//Response实体类


public class Response {
String responseStr;

public String getResponseStr() {
return responseStr;
}

public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}

}

//运行结果