Skip to main content

Chain of Responsibility Pattern

為避免請求發送者和接收者耦合在一起,讓多個物件都有可能接收請求。將這些接收物件連接成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。

職責模式又稱為責任鏈模式,它將請求的發送者和接收者解耦。用戶端不需要知道請求處理者的明確資訊和處理的具體邏輯,甚至不需要知道鏈的結構,它只需要將請求進行發送即可。

鏈條上的每一個人(物件)只處理自己職責範圍內的請求,對於自己處理不了的請求,直接交給下一個責任人,這就是職責模式的核心思維。

設計要點

  1. 請求者與請求內容:確認誰要發送請求,發送請求的物件稱為請求者。請求的內容透過發送請求時的參數進行傳遞。
  2. 有哪些責任人:責任人是構成責任鏈的關鍵要素。請求的流動方向是鏈條中的線,而責任人則是鏈條上的節點,線和節點共同構成了一條鏈條。
  3. 對責任人進行抽象:真實世界中的責任人多種多樣,紛繁複雜,有不同的職責和功能; 但他們也有一個共同的特徵一都可以處理請求。所以需要對責任人進行抽象,使他們具有責任的可傳遞性。
  4. 責任人可自由組合:責任鏈上的責任人可以根據業務的具體邏輯進行自由的組合和排序。

優點

  1. 降低耦合度。它可以將請求的發送者和接收者解耦。
  2. 簡化了物件。它使得物件不需要知道鏈的結構。
  3. 增強給物件指派職責的靈活性。可改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任的人。
  4. 增加新的處理類別很方便。

缺點

  1. 不能保證請求一定被接收。
  2. 系統性能將受到一定的影響,

使用情境

  1. 有多個物件可以處理同一個請求,具體哪個物件處理該請求在運行時刻自動確定。
  2. 請求的處理具有明顯的一層層傳遞關係。
  3. 請求的處理流程和順序需要程式運行時動態確定
  4. 常見的審批流程(例如賬務報銷)
note

來源: Python 設計模式 - 羅偉富