設計模式—責任鏈模式
阿新 • • 發佈:2017-05-19
[] .com repl ring replace servlet 就業 返回 array
責任鏈將處理請求在鏈條的節點上傳遞,每到一個節點可被處理或者也可不被處理。
典型的是在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
的順序相反。
過濾鏈處理之後結果:
設計模式—責任鏈模式