java设计模式---责任链模式(Responsibility)
java设计模式---责任链模式(Responsibility)
模拟请求对象 Request
package laona; /** * 模拟请求对象 */ public class Request { // 简单封装一种字符串类型 private String requestString; public Request (String message) { this.requestString = message; } public String getRequestString() { return requestString; } public void setRequestString(String requestString) { this.requestString = requestString; } }
模拟Response对象
package laona; /** * 模拟响应对象 */ public class Response { private String responseString; public Response (String message) { this.responseString = message; } public String getResponseString() { return responseString; } public void setResponseString(String responseString) { this.responseString = responseString; } }
定义 Filter接口
package laona; /** * 责任链模式 请求正序 响应倒序 通过过滤器 */ public interface Filter { /** * doFilter(); * 即过滤 request 又要过滤 response * @param request * @param response * @return */ void doFilter(Request request, Response response, FilterChain chain); }
定义FilterChain接口
package laona; import java.util.ArrayList; import java.util.List; public class FilterChain implements Filter { private Integer index = 0; /** * 定义一个list集合用于存取Filter */ private List<Filter> filterList = new ArrayList<>(); /** * 向集合中添加数据 * @param filter * @return */ public FilterChain addFilter (Filter filter) { filterList.add(filter); return this; } /** * 从集合中添加元素 * @param filter * @return */ public FilterChain deleteFilter (Filter filter) { filterList.remove(filter); return this; } public List<Filter> getFilterList() { return filterList; } /** * 实现接口Filter中的doFilter方法 * @param request * @param response */ @Override public void doFilter(Request request, Response response, FilterChain chain) { // 没有filter if (index == filterList.size()) { return; } Filter filter = filterList.get(index); index ++; filter.doFilter(request, response, chain); } }
自定义过滤器-1
package laona; /** * html 自定义过滤器 */ public class HTMLFilter implements Filter { /** * 将<html>转换成[html] * @param request * @param response */ @Override public void doFilter (Request request, Response response, FilterChain chain) { // 处理request request.getRequestString().replace("<", "{") .replace(">","]" ); System.out.println("---> request HTMLFilter <---"); // 进入下一个filter chain.doFilter(request, response, chain); // 处理response response.getResponseString().replace("", ""); System.out.println("---> response HTMLFilter <---"); } }
自定义过滤器-2
package laona; /** * 去除空格 过滤器 */ public class NullFilter implements Filter { @Override public void doFilter (Request request, Response response, FilterChain chain) { // 处理request request.setRequestString(request.getRequestString().replaceAll(" ", "")); System.out.println("---> request NullFilter <---"); chain.doFilter(request, response, chain); // 处理response response.getResponseString().replace("", ""); System.out.println("---> response NullFilter <---"); } }
自定义过滤器-3
package laona; /** * BadLanguageFilter 过滤器 */ public class BadLanguageFilter implements Filter { /** * 将和尚等字符转换成* * @param request * @param response */ @Override public void doFilter (Request request, Response response, FilterChain chain) { // 处理request request.setRequestString(request.getRequestString().replace("和尚", "*")); System.out.println("---> reques BadLanguageFilter <---"); chain.doFilter(request, response, chain);
// 处理response
response.getResponseString().replace("", ""); System.out.println("---> response BadLanguageFilter <---"); } }
测试类
package laona; import org.junit.Test; /** * 责任链模式 测试类 */ public class ResponsibilityTest { @Test public void responsibilityTest01 () { String message = "woshi 老衲,<html>,你是哪个和尚?"; FilterChain filterChain = new FilterChain(); Request request = new Request(message); Response response = new Response(message); filterChain.addFilter(new NullFilter()).addFilter(new BadLanguageFilter()).addFilter(new HTMLFilter()); filterChain.doFilter(request, response, filterChain); System.out.println(request.getRequestString()); System.out.println(response.getResponseString()); } }
测试结果
以上代码很简单,关键在于思想的提炼.