責任鏈模式 (Chain of Responsibility Pattern) 責任鏈模式相信很多人在工作中也接觸過。 javax.servlet.Filter struts的攔截器 SpringMVC的攔截器 那麼,接下來我們來進行更加深入的、直觀的瞭解。 講解重點 責任鏈示例代碼 鏈條與鏈條之間 ...
責任鏈模式
(Chain of Responsibility Pattern)
責任鏈模式相信很多人在工作中也接觸過。
- javax.servlet.Filter
- struts的攔截器
- SpringMVC的攔截器
那麼,接下來我們來進行更加深入的、直觀的瞭解。
講解重點
- 責任鏈示例代碼
- 鏈條與鏈條之間操作示範
- 自己實現簡單的鏈式編程
定義
顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。
上面的一大堆看不懂,那我們通過幾個例子進行解析,看完例子相信,你可以直接用自己的話,解釋什麼是責任鏈模式
舉個慄子
- 父類介面Filter
/**
* 為了實現filter鏈條的順序執行依賴於上一個Filter的返回值
* 修改Filter中的doFilter的返回類型為boolean
*/
interface Filter {
boolean doFilter(Msg msg);
}
- 一系列過濾器
- 鏈條類
//過濾鏈
class FilterChain implements Filter {
List<Filter> filters = new ArrayList<>(16);
//直接返回FilterChain,再進行add時代碼易讀性增大(鏈式編程)
public FilterChain add(Filter filter) {
filters.add(filter);
return this;
}
public void remove(Filter filter) {
filters.remove(filter);
}
public boolean doFilter(Msg msg) {
for (Filter filter : filters) {
if(!filter.doFilter(msg)){
return false;
}
}
return true;
}
}
- 測試程式
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:); <script> ,歡迎訪問 taobao.com ,大家都是996");
FilterChain filterChain = new FilterChain();
filterChain.add(new HtmlFilter()).add(new SensitiveFilter());
FilterChain filterChain2 = new FilterChain();
filterChain2.add(new EmjogFilter()).add(new UrlFilter());
/**
* 讓FilterChain實現Filter介面,這個鏈條也可以當作是一個Filter加到別的鏈條上去
*/
filterChain.add(filterChain2);
filterChain.doFilter(msg);
System.out.println(msg);
}
}
- 輸出
結語
測試程式中將過濾器,分別放到了兩個FilterChain.
其一:演示責任鏈的工作流程
其二:演示鏈條與鏈條之間的處理
這樣就通過責任鏈模式,簡單的實現了過濾操作。