責任鏈模式
(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.
其一:演示責任鏈的作業流程
其二:演示鏈條與鏈條之間的處理
這樣就通過責任鏈模式,簡單的實作了過濾操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6011.html
標籤:設計模式
上一篇:軟體設計模式修煉 -- 策略模式
下一篇:【設計模式】如何用組合替代繼承
