🎯 什麼情境該想到我

當你「有好幾個流程整體步驟大同小異,只有其中某幾步做法不同,想把共同的骨架固定下來、只讓變動的步驟由子類去填」的時候(例如框架提供的鉤子、一套固定的資料處理流程)。

⚙️ 怎麼用(步驟 / 公式)

意圖:在一個方法中定義一個演算法的骨架,而將其中某些步驟延遲到子類別中。範本方法讓子類別可以在不改變演算法整體結構的前提下,重新定義演算法的某些特定步驟。

主要參與者 / 結構:

  • AbstractClass(抽象類別):定義 templateMethod(),按固定順序呼叫數個步驟;其中一些步驟是抽象的(或提供預設)。
  • ConcreteClass(具體子類別):實作那些被延遲的抽象步驟,不動整體流程。

做法要點:

  1. 把流程寫成一個範本方法,依序呼叫各個步驟。
  2. 共通、不變的步驟在父類直接實作;會變的步驟宣告成抽象,交給子類實作。
  3. 可留「hook(鉤子)」:父類給預設空實作,子類選擇性覆寫,用來在流程特定點插入行為。
  4. 通常把範本方法設為 final/不可覆寫,確保骨架被固定住(好萊塢原則:Don’t call us, we’ll call you)。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 靠繼承達成,子類與父類是編譯期綁定的強耦合;若想執行期抽換整套演算法,改用策略(靠組合)。
  • 別把步驟切得太多太細,否則子類要覆寫一堆方法,反而難懂。
  • 骨架若常變,所有子類都會受牽連。

🔗 相關工具