模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变该算法的结构即可重定义该算法的某些特定步骤。
实际应用场景
假设我们在开发一个数据处理系统,不同类型的数据需要不同的处理方式,但处理流程的大致步骤是相同的。我们可以使用模板方法模式来定义处理流程的骨架,并将具体的处理步骤延迟到子类中实现。
模板方法模式的实现步骤
- 定义抽象基类:在抽象基类中定义一个模板方法,模板方法中定义了算法的骨架,并调用一些抽象方法。
- 实现具体子类:具体子类实现抽象方法,以完成特定步骤的处理。
代码示例
以下是一个使用模板方法模式处理不同类型数据的示例:
#include <iostream>
// 抽象基类
class DataProcessor {
public:
// 模板方法
void process() {
readData();
processData();
saveData();
}
virtual ~DataProcessor() = default;
protected:
// 抽象方法,具体子类需要实现这些方法
virtual void readData() = 0;
virtual void processData() = 0;
virtual void saveData() = 0;
};
// 具体子类:处理文本数据
class TextDataProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "Reading text data." << std::endl;
}
void processData() override {
std::cout << "Processing text data." << std::endl;
}
void saveData() override {
std::cout << "Saving text data." << std::endl;
}
};
// 具体子类:处理图像数据
class ImageDataProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "Reading image data." << std::endl;
}
void processData() override {
std::cout << "Processing image data." << std::endl;
}
void saveData() override {
std::cout << "Saving image data." << std::endl;
}
};
int main() {
// 处理文本数据
DataProcessor* textProcessor = new TextDataProcessor();
textProcessor->process();
delete textProcessor;
// 处理图像数据
DataProcessor* imageProcessor = new ImageDataProcessor();
imageProcessor->process();
delete imageProcessor;
return 0;
}
代码解析
-
抽象基类
DataProcessor
:- 定义了一个模板方法
process
,该方法定义了数据处理的骨架流程。 process
方法依次调用readData
、processData
和saveData
方法,这些方法是抽象的,具体子类需要实现它们。
- 定义了一个模板方法
-
具体子类:
TextDataProcessor
实现了DataProcessor
类的抽象方法,提供了处理文本数据的具体实现。ImageDataProcessor
实现了DataProcessor
类的抽象方法,提供了处理图像数据的具体实现。
-
客户端代码:
- 创建
TextDataProcessor
实例并调用process
方法,处理文本数据。 - 创建
ImageDataProcessor
实例并调用process
方法,处理图像数据。
- 创建
总结
模板方法模式通过在抽象基类中定义一个模板方法,提供算法的骨架,而将具体的步骤延迟到子类中实现。这样,子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。在这个示例中,我们定义了数据处理的通用流程,并通过不同的子类实现特定数据类型的处理步骤。这样可以使代码更加灵活和可扩展。