設計模式-職責鏈模式(Chain of Responsibility)

欢乐豆123發表於2024-07-23

設計模式-策略模式(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
這一系列攔截器的處理流程,也同樣是職責鏈模式的實現

相關文章