首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 模板方法模式深度解析:從買寶馬車理解設計精髓

     編輯:Java 綜合教學

Java 模板方法模式深度解析:從買寶馬車理解設計精髓

模板方法模式 屬於行為型設計模式,其核心思想是:在抽象類中定義演算法的骨架(確定步驟),將某些具體步驟延遲到子類實現(不確定步驟)。這樣既能復用固定流程,又能靈活擴展變化部分。

模式結構與關鍵角色

  • AbstractClass(抽象類):實現模板方法,定義演算法框架,宣告抽象方法供子類實現
  • ConcreteClass(具體類):實現抽象方法,完成具體步驟

生活化場景:買寶馬 1 系

近期想入手 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 音響...
這款車整體配置就是這樣,但顏色可以個性化選擇,你想要白色還是紅色呢?
我要紅色的!

模式優缺點分析

優點

  1. 復用固定流程:將不變行為上移至父類,消除子類重複代碼
  2. 靈活擴展:子類只需實現變化步驟,符合開放-封閉原則
  3. 逆向控制:父類呼叫子類實現的操作(好萊塢原則:「別呼叫我們,我們會呼叫你」)

缺點

  1. 類別膨脹:每種不同實現都需一個子類,導致類別數量增加
  2. 抽象層次加深:設計較為抽象,初學者可能難以理解流程控制權在父類

適用場景

  • 多個子類擁有相同演算法骨架,僅部分步驟不同
  • 重要、複雜的演算法,核心邏輯固定,邊界條件多變
  • 重構時提取公共行為到父類,避免代碼重複

模板方法模式雖簡單,卻是框架設計的基石(如 Spring 的 JdbcTemplate、HttpServlet 的 doGet/doPost、JUnit 的 setUp/tearDown)。掌握它,能讓您寫出更具擴展性的程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved