1:责任链模式概述
《设计模式》中给它的定义如下:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链来传递请求,直到有一个对象处理它为止。
从定义上可以看出,责任链模式的提出是为了“解耦”,以应变系统需求的变更和不明确性。
2:代码实现部分
2.1 Request类 代表一个请求类
package com.bjsxt.filter; public class Request { private String requestStr; public String getRequestStr() { return requestStr; } public void setRequestStr(String requestStr) { this.requestStr = requestStr; } }
2.2 Response类 代表一个回复类
package com.bjsxt.filter; public class Response { private String responseStr; public String getResponseStr() { return responseStr; } public void setResponseStr(String responseStr) { this.responseStr = responseStr; } }
2.3 Filter接口 代表一个请求处理接口
package com.bjsxt.filter; public interface Filter { public void doFilter(Request request, Response response, FilterChain chain); }
2.4 HTMLFilter类 代表一个HTML的请求处理类
package com.bjsxt.filter; public class HTMLFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { String requestStr = request.getRequestStr(); requestStr += "---HTMLFilter()"; request.setRequestStr(requestStr); chain.doFilter(request, response, chain); String responseStr = response.getResponseStr(); responseStr += "--HTMLFilterResponse"; response.setResponseStr(responseStr); } }
2.5 SesitiveFilter类 代表另外一个请求的处理类
package com.bjsxt.filter; public class SesitiveFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { String requestStr = request.getRequestStr(); requestStr += "---SesitiveFilter()"; request.setRequestStr(requestStr); chain.doFilter(request, response, chain); String responseStr = response.getResponseStr(); responseStr += "--SesitiveFilterResponse"; response.setResponseStr(responseStr); } }
2.6 FilterChain类 代表一个Filter的链式容器类
package com.bjsxt.filter; import java.util.ArrayList; import java.util.List; public class FilterChain implements Filter { private List<Filter> filters = new ArrayList<Filter>(); private int index = 0; public FilterChain addFilter(Filter filter) { this.filters.add(filter); return this; } @Override public void doFilter(Request request, Response response, FilterChain chain) { if(index == filters.size()) { return ; } Filter filter = filters.get(this.index); this.index++; filter.doFilter(request, response, chain); } }
2.7 Main类 测试类
package com.bjsxt.filter; public class Main { public static void main(String[] args) { Request request = new Request(); request.setRequestStr("request"); Response response = new Response(); response.setResponseStr("response"); FilterChain chain = new FilterChain(); chain.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter()); chain.doFilter(request, response, chain); System.out.println(request.getRequestStr()); System.out.println(response.getResponseStr()); } }
2.8 输出结果
request---HTMLFilter()---SesitiveFilter()
response--SesitiveFilterResponse--HTMLFilterResponse