Swift設計模式 – 責任鏈模式(Chain of Responsibility Pattern)

Stone Bakery想要進一步快速發展,決定開始請教專家如何將工作流程優化甚至自動化,於是又找到了你和我。

我們從調查中發現,由於Stone Bakery幾乎每天都在進貨,而員工都會先代付費用之後再向店長確認費用報銷,於是店長幾乎每天都要處理報銷的問題,

我們認為店長可以下發權限,對於一些金額較小的費用可以直接讓其他人來做審核。


開發用於報銷費用的系統

我們建立了ConfirmPayment,並且在裡面設立了三種職位的報銷方法。

通過Struct Paymen來規範報銷的格式,需要有報銷人、金額、用途。

之後Stone Bakery約定好,金額在1000以下的可以直接找Team Leader審核,1,000 ~ 10,000的可以找Chef審核,更大的金額才需要找店長Boss

我們來建立幾筆費用試試看:

這下店長應該會輕鬆很多了~!

不過似乎每次調用報銷系統都需要了解ConfirmPayment中具體的規則,比如10,000以上的費用就要找Boss,有沒有不需要了解具體實現方法就進行報銷的方法呢?


責任鏈模式(Chain of Responsibility Pattern)

責任鏈模式通過鏈式的方式將這些消息傳送類組織起來。

如果責任鏈上的某個鏈可以處理Paymen對象的請求,他就會承擔起這個責任。如果不能處理則會將請求傳遞給責任鏈上的下一個鏈,知道該請求得到相應或者到達責任鏈的盡頭。

責任鏈模式的關鍵在於對調用組件隱藏責任鏈上單個鏈的實現細節,而是用協議或者基類可以實現這樣的目的。v

我們建立一個Transmitter:

  • 其中nextLink用來記錄下一個鏈。
  • confirm方法中會判斷下一個鏈是否存在,如果有就交給下一個鏈,如果沒有就跳出走到尾端的提示
  • createChain用來建立鏈條。

然後讓每一個鏈都繼承Transmitter。

最後我們就可以做到在不了解具體審核機制的情況下直接調用方法了。

輸出結果:


iOS App開發中的例子

Cocoa Touch中的事件處理流程中的響應者鏈,當使用者在設備上點擊屏幕時,首先會找到被點擊的View,如果該View不處理點擊事件,則會沿著響應鏈向上回溯,比如交給父類View來處理,如果不處理則繼續向上回溯直到有對象處理或者走到響應鏈的尾端因無人處理而忽略掉。


可以到github上看看這個責任鏈模式的例子

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *