【設計樣式】「Chain of Responsibility」的範例與說明

範例描述

“敗家子” 是一部經典的武功喜劇,關於本片的劇情介紹,可以參考:【老片分享】經典功夫喜劇片—敗家子
其中,元彪所飾演的 “敗家子”,好打架,經常製造許多麻煩,但他又是九代單傳的寶貝兒子。父親怕他受傷,所以派了一個隨從 “派通街”,在背後協助解決所製造的麻煩。

敗家子是 “麻煩製造者(trouble maker)”,而派通街是 “麻煩處理者(trouble handler)”,敗家子所闖的禍,均交由派通街來處理。

而隨著製造的麻煩越多,派通街需要更多的助手來「分門別類」地處理,這些處理者逐漸有系統性地形成一種 “串鍊(chain)”,當麻煩透過派通街送進來時,第一個處理者認為麻煩不是他所處理的,就會交給後續的(successor)處理者來處理,如此依序跑完整個 “串鍊”,若沒有人可以處理,則拋出 “無法處理” 的訊息。

CoR(Chain of Responsibility) 的說明

敗家子永遠不用擔心 “誰” 來幫他處理麻煩,只要將麻煩丟給一致的介面(interface)–派通街處理即可。

視麻煩的程度或種類,交由串鍊中某一個處理者來處理,當然也有可能因麻煩大到無法解決,而沒有處理者可以處理。

這是一種 “責任的串鍊(Chain of Responsibility, CoR)”,Client 端(敗家子)不需要也不會知道 “誰” 來處理他所丟出的麻煩,如此可以降低 “Client” 與 “處理者” 的耦合(coupling)程度;但相對,”串鍊” 的處理者最好不要太多,否則因責任一直轉派的緣故,會降低處理效率。

CoR 類別圖(Class Diagram)說明

圖、CoR 的 UML 類別圖
(點擊圖片鏈接看原圖)圖、CoR 的 UML 類別圖

  • 把 “派通街” 角色設計為 “抽象類別(abstract class)”,他本身只負責制訂一致性的處理介面: handleTrouble(),與實作指向後續者(successor)的鏈結。
  • 來自 “敗家子” 的 “Trouble” 訊息,會依照麻煩的大小程度依序交給 “大、中、小” 三個具體的類別來處理;其中 “Null Trouble Handler” 類別,並非是空的,而是指麻煩超乎程度而無法處理了。
  • “大、中、小、Null” 四個具體(concrete)的類別,會覆寫(override) “handleTrouble()” 操作(operation),個別實作處理麻煩的方法。
  • “麻煩(Trouble)” 被當作參數從敗家子傳給派通街,實做上可以是 “字串”、”XML”、”物件” 等。

文章導覽

   

共有 3 則迴響

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *