模板方法模式:在抽象類中定義算法骨架,將具體步驟延遲到子類實現。子類不改變算法結構即可重定義特定步驟。
| 方法類型 | 定義者 | 實現者 | 特點 |
|---|---|---|---|
| 基本方法 | 抽象類聲明 | 子類實現 | 算法步驟細節,protected 封裝 |
| 模板方法 | 抽象類聲明並實現 | 抽象類 | 算法框架,調用基本方法,**通常 final 禁止覆寫** |
| 鉤子方法 | 抽象類聲明並默認實現 | 子類可選擇覆寫 | 影響流程控制(如 isNeedSort()),默認空實現 |
public abstract class AbstractSort {
// 基本方法:由子類實現具體排序算法
protected abstract void sort(int[] array);
// 模板方法:final 固化流程
public final void showSortResult(int[] array) {
this.sort(array); // 步驟1:排序(延遲到子類)
System.out.print("排序結果:"); // 步驟2:打印(固化邏輯)
for (int v : array) System.out.printf("%3s", v);
}
}
public class ConcreteSort extends AbstractSort {
@Override protected void sort(int[] array) {
for (int i = 0; i < array.length - 1; i++) selectSort(array, i);
}
private void selectSort(int[] array, int index) {
// 選擇排序具體實現...
}
}
AbstractSort s = new ConcreteSort();
s.showSortResult(new int[]{10, 32, 1, 9, 5, 7, 12, 0, 4, 3});
// 輸出:0 1 3 4 5 7 9 10 12 32
protected 封裝,對外不可見if (hook()) doSomething())final 防止子類破壞流程模板方法模式是框架設計的基石:父類搭台唱戲(定流程),子類進場表演(填細節)。Spring JdbcTemplate、HttpServlet、集合類 Collections.sort() 皆是經典應用。掌握「什麼變、什麼不變」的邊界劃分,是駕馭此模式的關鍵。