模板方法模式 (Template Method Pattern)
意图:定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。
基础组件
- AbstractClass (抽象类):定义模板方法和基本操作
- ConcreteClass (具体类):实现基本操作
继承/实现关系
AbstractClass <|-- ConcreteClass
应用场景
- 一次性实现算法的不变部分,将可变行为留给子类
- 控制子类扩展(通过钩子方法)
- 多个子类有公共行为时提取到父类
C++ 实现(数据处理流程)
#include <iostream>
#include <string>
/*
* 模板方法模式
* 意图:定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。
* 基础组件:
* AbstractClass (抽象类):定义模板方法和基本操作
* ConcreteClass (具体类):实现基本操作
* 继承/实现关系:
* ConcreteClass 继承自 AbstractClass,并实现其基本操作。
*/
// 抽象类:数据处理流程
class DataProcessor {
public:
// 模板方法:定义处理流程(算法的基本骨架)
void process() {
loadData();
validateData();
transformData();
saveResults();
cleanup();
}
virtual ~DataProcessor() = default;
protected:
// 基本操作(由子类实现)
virtual void loadData() = 0;
virtual void transformData() = 0;
// 默认实现(可被子类覆盖)
virtual void validateData() {
std::cout << "Validating data using default validation...\n";
}
virtual void saveResults() {
std::cout << "Saving results to default location...\n";
}
// 钩子方法(可选覆盖)
virtual void cleanup() {
std::cout << "Performing default cleanup...\n";
}
};
// 具体类:CSV数据处理
class CSVProcessor : public DataProcessor {
protected:
void loadData() override {
std::cout << "Loading data from CSV file...\n";
// 实际加载逻辑
}
void transformData() override {
std::cout << "Transforming CSV data...\n";
// 实际转换逻辑
}
void saveResults() override {
std::cout << "Saving CSV results to database...\n";
}
};
// 具体类:JSON数据处理
class JSONProcessor : public DataProcessor {
protected:
void loadData() override {
std::cout << "Loading data from JSON file...\n";
// 实际加载逻辑
}
void transformData() override {
std::cout << "Transforming JSON data...\n";
// 实际转换逻辑
}
void validateData() override {
std::cout << "Validating JSON data with schema...\n";
}
void cleanup() override {
std::cout << "Cleaning up JSON temporary files...\n";
}
};
void TemplateMethodPattern()
{
std::cout << std::string(9, '-') << " Template Method Pattern " << std::string(9, '-') << std::endl;
std::cout << "Processing CSV data:\n";
CSVProcessor csvProcessor;
csvProcessor.process();
std::cout << "\nProcessing JSON data:\n";
JSONProcessor jsonProcessor;
jsonProcessor.process();
}
组件对应关系
DataProcessor→ 抽象类CSVProcessor/JSONProcessor→ 具体类
1048

被折叠的 条评论
为什么被折叠?



