责任链模式(Chain Of Responsibility)指在数据对象存储前进行对此的限制处理,从而避免请求的发送者和接受者之间的耦合关系,责任链里的排列顺序类似于栈,数据对象经过责任链的一层层处理。用户的请求处理与响应处理的顺序是相反的。
建立用户请求和接收对象Request和Respon
package com.mby.dp.filter;
public class Request {
String requestStr;
public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
package com.mby.dp.filter;
public class Response {
String responseStr;
public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
Filter接口定义:
package com.mby.dp.filter;
public interface Filter {
public void doFilter(Request request, Response response, FilterChain fc);
}
定义责任链并实现Filter接口:
package com.mby.dp.filter;
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 fc) {
if(index == filters.size()) {
return;
}
Filter f = filters.get(index);
index++;
f.doFilter(request, response, fc);
}
}
定义2个处理限制:
package com.mby.dp.filter;
public class HTMLFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain fc) {
request.requestStr = request.requestStr.replace("<", "[")
.replace(">", "]") + "----HTMLFilter----";
fc.doFilter(request, response, fc);
response.responseStr += "----HTMLFilter----";
}
}
package com.mby.dp.filter;
public class SensitiveFilter implements Filter{
@Override
public void doFilter(Request request, Response response, FilterChain fc) {
request.requestStr = request.requestStr.replace("敏感", "") + "----SensitiveFilter----";
fc.doFilter(request, response, fc);
response.responseStr += "----SensitiveFilter----";
}
}
主方法:
package com.mby.dp.filter;
public class Test {
public static void main(String[] args) {
String s = "大家好:),<javascript>敏感,被就业";
Request request = new Request();
Response response = new Response();
request.setRequestStr(s);
response.setResponseStr(s);
FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter())
.addFilter(new SensitiveFilter());
fc.doFilter(request, response, fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
输出结果:
大家好:),[javascript],被就业----HTMLFilter--------SensitiveFilter----
大家好:),<javascript>敏感,被就业----SensitiveFilter--------HTMLFilter----
注意输出结果顺序是:HTMLFilter--SensitiveFilter--SensitiveFilter--HTMLFilter
而不是:HTMLFilter--SensitiveFilter--HTMLFilter--SensitiveFilter