Chain of Responsibility Pattern
為避免請求發送者和接收者耦合在一起,讓多個物件都有可能接收請求。將這些接收物件連接成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。
職責模式又稱為責任鏈模式,它將請求的發送者和接收者解耦。用戶端不需要知道請求處理者的明確資訊和處理的具體邏輯,甚至不需要知道鏈的結構,它只需要將請求進行發送即可。
鏈條上的每一個人(物件)只處理自己職責範圍內的請求,對於自己處理不了的請求,直接交給下一個責任人,這就是職責模式的核心思維。
設計要點
- 請求者與請求內容:確認誰要發送請求,發送請求的物件稱為請求者。請求的內容透過發送請求時的參數進行傳遞。
- 有哪些責任人:責任人是構成責任鏈的關鍵要素。請求的流動方向是鏈條中的線,而責任人則是鏈條上的節點,線和節點共同構成了一條鏈條。
- 對責任人進行抽象:真實世界中的責任人多種多樣,紛繁複雜,有不同的職責和功能; 但他們也有一個共同的特徵一都可以處理請求。所以需要對責任人進行抽象,使他們具有責任的可傳遞性。
- 責任人可自由組合:責任鏈上的責任人可以根據業務的具體邏輯進行自由的組合和排序。
優點
- 降低耦合度。它可以將請求的發送者和接收者解耦。
- 簡化了物件。它使得物件不需要知道鏈的結構。
- 增強給物件指派職責的靈活性。可改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任的人。
- 增加新的處理類別很方便。
缺點
- 不能保證請求一定被接收。
- 系統性能將受到一定的影響,
使用情境
- 有多個物件可以處理同一個請求,具體哪個物件處理該請求在運行時刻自動確定。
- 請求的處理具有明顯的一層層傳遞關係。
- 請求的處理流程和順序需要程式運行時動態確定。
- 常見的審批流程(例如賬務報銷)
note
來源: Python 設計模式 - 羅偉富