🎯 什麼情境該想到我
當你「有好幾個流程整體步驟大同小異,只有其中某幾步做法不同,想把共同的骨架固定下來、只讓變動的步驟由子類去填」的時候(例如框架提供的鉤子、一套固定的資料處理流程)。
⚙️ 怎麼用(步驟 / 公式)
意圖:在一個方法中定義一個演算法的骨架,而將其中某些步驟延遲到子類別中。範本方法讓子類別可以在不改變演算法整體結構的前提下,重新定義演算法的某些特定步驟。
主要參與者 / 結構:
- AbstractClass(抽象類別):定義
templateMethod(),按固定順序呼叫數個步驟;其中一些步驟是抽象的(或提供預設)。 - ConcreteClass(具體子類別):實作那些被延遲的抽象步驟,不動整體流程。
做法要點:
- 把流程寫成一個範本方法,依序呼叫各個步驟。
- 共通、不變的步驟在父類直接實作;會變的步驟宣告成抽象,交給子類實作。
- 可留「hook(鉤子)」:父類給預設空實作,子類選擇性覆寫,用來在流程特定點插入行為。
- 通常把範本方法設為 final/不可覆寫,確保骨架被固定住(好萊塢原則:Don’t call us, we’ll call you)。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 靠繼承達成,子類與父類是編譯期綁定的強耦合;若想執行期抽換整套演算法,改用策略(靠組合)。
- 別把步驟切得太多太細,否則子類要覆寫一堆方法,反而難懂。
- 骨架若常變,所有子類都會受牽連。
🔗 相關工具
- 策略模式 Strategy(同樣讓「部分行為可變」,但策略換的是整個演算法且靠組合;範本方法只換步驟且靠繼承)
- 工廠方法模式 Factory Method(工廠方法常被當成範本方法裡的一個可覆寫步驟,用來建立物件)
- 工具-優先組合而非繼承(對照:範本方法是繼承路線,想避免繼承耦合時考慮組合)
- 工具-封裝變化點(把「會變的步驟」隔離成可覆寫的方法)
- 設計模式