設計模式-策略模式(Chain of Responsibility)
概要
記憶關鍵詞:傳遞請求,職責連結
定義:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳送請求,直到有一個物件處理它為止。
分析:當客戶提交一個請求,請求是沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。
職責鏈模式結構圖如下:
一、能解決什麼問題?
二、涉及的角色
1. 抽象類Handler
統一的抽象類
1 abstract public class Handler { 2 protected Handler successor; 3 4 public void setSuccessor(Handler successor) { 5 this.successor = successor; 6 } 7 8 abstract String handleRequest(String msg); 9 10 }
2. ConcreteHandler
職責鏈模式的每一個具體 Handler類都繼承自統一的抽象類
1 public class HandlerA extends Handler{ 2 @Override 3 String handleRequest(String msg) { 4 if(msg.contains("a")){ 5 msg = msg.replace('a', '*'); 6 } else if(this.successor != null){ 7 msg = this.successor.handleRequest(msg); 8 } 9 return msg; 10 } 11 }
3. Client
定義鏈的結構
## 2.優缺點分析
### 2.1 優點
- 由於是在客戶端定義鏈的結構,因此可以隨時地增加或者修改處理一個請求的結構,增強了給物件指派職責的靈活性
### 2.2 缺點
- debug:對程式碼Debug不太友好。在程式碼邏輯比較複雜,鏈路比較長的情況下,Debug可能要深入很多層。
## 3.注意事項
一個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理,這就很糟糕了,需要事先考慮全面
## 4. 專案中的使用
- 過濾器Filter
當客戶端對Web應用發出HTTP請求的時候,會首先經過Tomcat容器的一層層過濾器(Filter),過濾器會針對請求的訪問許可權、引數合法性等方面進行驗證和過濾。
- Springboot中的攔截器:Interceptor
這一系列攔截器的處理流程,也同樣是職責鏈模式的實現