模板方法模式在父類定義算法骨架,將可變步驟延遲到子類實現,實現「好萊塢原則:別調用我們,我們會調用你」。它是代碼復用與擴展的基石,廣泛應用於框架設計。
final,調用抽象方法組裝骨架,禁止覆蓋。抽象類:由架構師/資深工程師編寫,決定系統穩定性。
實現類:由初/中級工程師填充細節,單元測試通過即保證整體正確。
abstract class AbstractSort {
protected abstract void sort(int[] arr); // 抽象方法
public final void showSortResult(int[] arr) { // 模板方法
sort(arr);
printArray(arr);
}
protected void printArray(int[] arr) { // 鉤子方法,可覆蓋
System.out.print("排序結果:");
for (int n : arr) System.out.printf("%3d", n);
System.out.println();
}
}
class QuickSort extends AbstractSort {
protected void sort(int[] arr) { /* 快排實現 */ }
}
class BubbleSort extends AbstractSort {
protected void sort(int[] arr) { /* 冒泡實現 */ }
}
| 優點 | 缺點/風險 |
|---|---|
| 復用不變邏輯,隔離變化點 | 子類影響父類行為,違反里氏替換原則 |
| 易於擴展新算法,符合開閉原則 | 層次過深導致「面條式代碼」,難以閱讀 |
| 控制反轉,框架掌握主動權 | 抽象方法過多增加子類實現負擔 |
hook 或 do 開頭;關鍵模板方法加 final;結合工廠模式實例化具體子類。模板方法模式是繼承的正統用法:父類定義「什麼時候做什麼」,子類定義「具體怎麼做」。它將架構師的設計意圖固化為代碼骨架,指導團隊在規範框架內高效協作,是框架級代碼的標配模式。