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

Java 設計模式精講:模板方法模式 — 定義算法骨架,延遲步驟到子類實現

     編輯:Java 綜合教學

Java 設計模式精講:模板方法模式 — 定義算法骨架,延遲步驟到子類實現

模板方法模式 UML 類圖

模板方法模式屬於行為型模式,核心思想:**在父類定義算法骨架 (模板方法),將變化的步驟延遲到子類實現**,實現「好萊塢原則」——「別調用我們,我們會調用你」。

核心角色

  • AbstractClass (抽象類):定義模板方法 (final),宣告抽象基本方法
  • ConcreteClass (具體子類):實現抽象基本方法,提供具體行為

代碼實戰:汽車啟動流程

抽象父類:CarModel.java

package com.roc.template;

public abstract class CarModel {
    // 基本方法:由子類實現
    protected abstract void start();  // 啟動
    protected abstract void stop();   // 熄火
    
    // 模板方法:final 防止被覆寫,鎖定算法骨架
    final public void execute() {
        this.start();  // 步驟 1
        // 可在此插入通用邏輯:檢查油量、自檢...
        this.stop();   // 步驟 2
    }
}

具體子類:Wcar.java (大眾)

package com.roc.template;

public class Wcar extends CarModel {
    @Override
    protected void start() {
        System.out.println("大眾車啟動 ... 突突突");
    }
    @Override
    protected void stop() {
        System.out.println("大眾車熄火 ... 輕輕一扭");
    }
}

具體子類:Ocar.java (奧迪)

package com.roc.template;

public class Ocar extends CarModel {
    @Override
    protected void start() {
        System.out.println("奧迪 無鑰啟動 突突突");
    }
    @Override
    protected void stop() {
        System.out.println("奧迪 自動駐車熄火");
    }
}

客戶端測試:Client.java

package com.roc.template;

public class Client {
    public static void main(String[] args) {
        CarModel wcar = new Wcar();  // 多態:父類引用指向子類物件
        wcar.execute();              // 執行模板方法
        
        CarModel ocar = new Ocar();
        ocar.execute();
    }
}

輸出結果

大眾車啟動 ... 突突突
大眾車熄火 ... 輕輕一扭
奧迪 無鑰啟動 突突突
奧迪 自動駐車熄火

適用場景 (GoF 經典三條)

  1. 一次性實現算法不變部分,將變化行為委託子類 (如:資料庫操作模板 — 連線/提交/回滾固定,SQL 執行變化)
  2. 提取公共行為到父類,消除子類代碼重複 (重構「重分解以一般化」)
  3. 控制子類擴展點,僅在特定 Hook 方法允許擴展 (如:isNeedLog() 決定是否記錄日誌)

Hook 方法進階用法

public abstract class DataProcessor {
    // 模板方法
    final public void process() {
        readData();
        if (needTransform()) {  // Hook:子類可選擇是否轉換
            transformData();
        }
        saveData();
    }
    
    protected abstract void readData();
    protected abstract void saveData();
    protected void transformData() {}  // 預設空實現
    
    // Hook 方法:回傳 boolean 控制流程
    protected boolean needTransform() {
        return true;  // 預設需轉換,子類可覆寫
    }
}

優缺點總結

優點缺點
封裝不變部分,擴展變化部分類數量增加,系統較大時類爆炸
提取公共代碼,便於維護反向控制結構增加理解難度
受控擴展點,符合開閉原則父類修改可能影響所有子類
經典應用:HttpServlet.service() (模板方法) → doGet/doPost (基本方法);AbstractList、InputStream、Spring JdbcTemplate、MyBatis BaseExecutor 等框架大量使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved