cover

Template Method 模式:流程先定,細節後補

Template Method 模式先定義一套固定流程,允許子類別覆寫特定步驟,保持流程一致又具彈性。

classDiagram
    class DataProcessor {
        <<abstract>>
        +process(data) any
        +loadData(data)* any
        +validateData(data)* any
        +parseData(data)* any
        +outputResult(data) any
    }
    class CSVDataProcessor {
        +loadData(data) any
        +validateData(data) any
        +parseData(data) String[]
    }
    class JSONDataProcessor {
        +loadData(data) any
        +validateData(data) any
        +parseData(data) Object
    }
    DataProcessor <|-- CSVDataProcessor
    DataProcessor <|-- JSONDataProcessor
    note for DataProcessor "process() 定義固定流程\n子類別覆寫各步驟"

使用情境

  1. 檔案處理:CSV、JSON 共用讀取流程。
  2. 報表生成:輸出 PDF、Excel 共用步驟。
  3. 資料處理管線:前處理、解析、輸出固定,細節不同。

實作範例

Template Method 模式:固定流程骨架搭配可替換步驟

class DataProcessor {
  process(data) {
    const loaded = this.loadData(data);
    const validated = this.validateData(loaded);
    const parsed = this.parseData(validated);
    return this.outputResult(parsed);
  }
 
  loadData(data) {
    throw new Error('loadData must be implemented');
  }
 
  validateData(data) {
    throw new Error('validateData must be implemented');
  }
 
  parseData(data) {
    throw new Error('parseData must be implemented');
  }
 
  outputResult(data) {
    return data;
  }
}
 
class CSVDataProcessor extends DataProcessor {
  loadData(data) {
    console.log('Loading CSV data...');
    return data;
  }
 
  validateData(data) {
    console.log('Validating CSV format...');
    return data;
  }
 
  parseData(data) {
    console.log('Parsing CSV to objects...');
    return data.split(',');
  }
}
 
class JSONDataProcessor extends DataProcessor {
  loadData(data) {
    console.log('Loading JSON data...');
    return data;
  }
 
  validateData(data) {
    console.log('Validating JSON format...');
    return data;
  }
 
  parseData(data) {
    console.log('Parsing JSON...');
    return JSON.parse(data);
  }
}
 
const csvProcessor = new CSVDataProcessor();
csvProcessor.process('a,b,c,d');

優點

  • 重複流程集中管理
  • 子類別只需關注差異
  • 易於維護

缺點

  • 子類別數量可能增加
  • 流程固定時彈性降低

延伸閱讀