在 Day 9 中,我们学习了命令模式(Command Pattern):
而今天的模板方法模式,强调的是:
在一个抽象流程中定义“固定结构”,而将可变步骤交给子类来实现。
模板方法模式(Template Method Pattern)是一种行为型设计模式,用于:
不变的流程 + 可变的步骤
场景类型 | 示例描述 |
---|---|
流程固定的算法骨架 | 报表导出流程、文档解析、代码生成等 |
钩子函数调用场景 | 操作系统回调、生命周期钩子 |
多子类复用共同行为 | 数据抓取流程、文件处理、协议接入 |
+---------------------+
| AbstractClass |
+---------------------+
| +templateMethod() |
| +step1() |
| +step2() |
+---------------------+
/\
/ \
+-------------------+ +-------------------+
| ConcreteClassA | | ConcreteClassB |
+-------------------+ +-------------------+
| +step2() override | | +step2() override |
+-------------------+ +-------------------+
我们实现一个数据导出器:支持将数据导出为 CSV、JSON 两种格式。
class DataExporter {
public:
void exportData() {
readData();
formatData();
writeToFile();
}
virtual ~DataExporter() = default;
protected:
virtual void readData() {
std::cout << "读取原始数据..." << std::endl;
}
virtual void formatData() = 0; // 子类必须实现
virtual void writeToFile() {
std::cout << "写入文件完成。" << std::endl;
}
};
class CsvExporter : public DataExporter {
protected:
void formatData() override {
std::cout << "格式化为 CSV 格式..." << std::endl;
}
};
class JsonExporter : public DataExporter {
protected:
void formatData() override {
std::cout << "格式化为 JSON 格式..." << std::endl;
}
};
int main() {
std::unique_ptr<DataExporter> exporter;
exporter = std::make_unique<CsvExporter>();
exporter->exportData();
exporter = std::make_unique<JsonExporter>();
exporter->exportData();
return 0;
}
场景名称 | 模板流程说明 |
---|---|
报表导出引擎 | 读取数据 → 格式化 → 输出 CSV/JSON/Excel |
编译器前端 | 词法分析 → 语法分析 → 语义分析 → 生成中间码 |
网络协议处理 | 接收请求 → 校验 → 解包 → 应答 |
游戏生命周期 | Init → Start → Update → Destroy |
业务模板系统 | 加载配置 → 数据处理 → 日志记录 |
模式 | 模板方法模式 | 策略模式 |
---|---|---|
目的 | 固定流程 + 可定制步骤 | 动态切换算法 |
调用者角色 | 调用方始终调用 templateMethod() |
外部显式切换策略对象 |
子类行为控制力 | 只允许重写“步骤”,流程固定 | 每个策略完全独立 |
“我们有一套导出系统使用模板方法模式设计。父类封装了导出的主流程,子类如 CsvExporter 和 JsonExporter 只需要重写格式化步骤。这样可以保证流程的一致性,并方便后期扩展其他格式(如 XML、Excel),而不影响整体框架。”
✅ 加分项:结合生命周期钩子、数据处理框架,强调“一致性 + 定制性”。
“流程归一父类写,细节自留子类做,钩子控制定结构,复用规范皆不破。”
责任链模式(Chain of Responsibility):事件/请求依次传递,灵活组合处理链条,打造解耦的响应系统。