
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子類別覆寫各步驟"
使用情境
- 檔案處理:CSV、JSON 共用讀取流程。
- 報表生成:輸出 PDF、Excel 共用步驟。
- 資料處理管線:前處理、解析、輸出固定,細節不同。
實作範例

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');優點
- 重複流程集中管理
- 子類別只需關注差異
- 易於維護
缺點
- 子類別數量可能增加
- 流程固定時彈性降低