設計模式—責任鏈模式,設計模式責任
責任鏈將處理請求在鏈條的節點上傳遞,每到一個節點可被處理或者也可不被處理。
典型的是在servlet中過濾器filter的的處理方式。當request請求或者response請求時,請求經過過濾鏈上的節點後,又進入下一個節點,直到鏈尾。
下面以模仿servlet中filter的處理方式(馬士兵老師設計模式講解內容):
1.過濾器介面
package com.bjsxt.dp.filter;public interface Filter { void doFilter(Request request, Response response, FilterChain chain);}
2.過濾器鏈
package com.bjsxt.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 chain) { if(index == filters.size()) return ; Filter f = filters.get(index); index ++; f.doFilter(request, response, chain); }}
3.過濾鏈_1
package com.bjsxt.dp.filter;public class HTMLFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { //process the html tag <> request.requestStr = request.requestStr.replace('<', '[') .replace('>', ']') + "---HTMLFilter()"; chain.doFilter(request, response, chain); response.responseStr += "---HTMLFilter()"; }}
4.過濾器_2
package com.bjsxt.dp.filter;public class SesitiveFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { request.requestStr = request.requestStr.replace("被就業", "就業") .replace("敏感", "") + "---SesitiveFilter()"; chain.doFilter(request, response, chain); response.responseStr += "---SesitiveFilter()"; } }
5.request請求
package com.bjsxt.dp.filter;public class Request { String requestStr; public String getRequestStr() { return requestStr; } public void setRequestStr(String requestStr) { this.requestStr = requestStr; }}
6.response請求
package com.bjsxt.dp.filter;public class Response { String responseStr; public String getResponseStr() { return responseStr; } public void setResponseStr(String responseStr) { this.responseStr = responseStr; } }
7.用戶端請求
package com.bjsxt.dp.filter;public class Main { /** * @param args */ 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 SesitiveFilter()) ; fc.doFilter(request, response, fc); System.out.println(request.getRequestStr()); System.out.println(response.getResponseStr()); }}
FilterChain中建立了一個過濾鏈,記錄了有多少個過濾器,並且遞迴調用doFilter,經過一個過濾器後就走下一個過濾器,直到鏈尾。在遞迴返回的時候接著對response處理,處理的順序和request
的順序相反。
過濾鏈處理之後結果: