模板方法模式 屬於行為型設計模式,其核心思想是:在抽象類中定義演算法的骨架(確定步驟),將某些具體步驟延遲到子類實現(不確定步驟)。這樣既能復用固定流程,又能靈活擴展變化部分。
近期想入手 BMW 1 系,到 4S 店發現現車只有一台,配置(引擎、外觀、內飾)完全固定,唯獨顏色可自選。這正是模板方法的完美寫照:
abstract class BuyCar {
// 模板方法:定義演算法骨架
public final void buy() {
// 確定功能:固定流程
System.out.println("歡迎來到寶馬 4S 店,我給你介紹下你選的這款車");
System.out.println("外觀:兩廂,家族式雙腎柵格,典型的寶馬臉");
System.out.println("引擎:2.0L 雙渦管單渦輪增壓引擎");
System.out.println("內飾:真皮座椅、氛圍燈、Harman Kardon 音響...");
System.out.println("這款車整體配置就是這樣,但顏色可以個性化選擇,你想要白色還是紅色呢?");
// 不確定功能:委派給子類
chooseColor();
}
// 抽象方法:由具體子類實現
public abstract void chooseColor();
}
class Buyer extends BuyCar {
@Override
public void chooseColor() {
System.out.println("我選白色的!");
}
}
// 另一個買家
class AnotherBuyer extends BuyCar {
@Override
public void chooseColor() {
System.out.println("我要紅色的!");
}
}
public class TemplateMethodDemo {
public static void main(String[] args) {
BuyCar buyer1 = new Buyer();
buyer1.buy();
System.out.println("------------------");
BuyCar buyer2 = new AnotherBuyer();
buyer2.buy();
}
}
歡迎來到寶馬 4S 店,我給你介紹下你選的這款車
外觀:兩廂,家族式雙腎柵格,典型的寶馬臉
引擎:2.0L 雙渦管單渦輪增壓引擎
內飾:真皮座椅、氛圍燈、Harman Kardon 音響...
這款車整體配置就是這樣,但顏色可以個性化選擇,你想要白色還是紅色呢?
我選白色的!
------------------
歡迎來到寶馬 4S 店,我給你介紹下你選的這款車
外觀:兩廂,家族式雙腎柵格,典型的寶馬臉
引擎:2.0L 雙渦管單渦輪增壓引擎
內飾:真皮座椅、氛圍燈、Harman Kardon 音響...
這款車整體配置就是這樣,但顏色可以個性化選擇,你想要白色還是紅色呢?
我要紅色的!
模板方法模式雖簡單,卻是框架設計的基石(如 Spring 的 JdbcTemplate、HttpServlet 的 doGet/doPost、JUnit 的 setUp/tearDown)。掌握它,能讓您寫出更具擴展性的程式碼。