一、模版方法模式简介
模板模式全称模版方法模式(Template Method Pattern),是行为型设计模式之一(GoF书中解释行为型设计模式:用来处理类、对象或模块之间的交互行为),模版方法模式用于定义一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。最典型的实际应用为STL(标准模板库)。
模版方法模式的结构图
模板方法模式的核心组成部分
抽象类(Abstract Class):
- 定义了一个模板方法,包含了算法的基本步骤,并调用了一些可以被子类重写的抽象方法或钩子方法。
- 提供了算法的框架和部分实现。
具体子类(Concrete Class):
- 实现抽象类中定义的抽象方法,完成具体的操作步骤。
- 可以重写或扩展算法中的某些步骤。
模板方法模式的关键特点
- 固定算法骨架:模板方法定义了算法的结构和步骤,但具体的细节可以在子类中实现。
- 允许扩展:子类可以扩展和修改算法的某些步骤,但不会改变算法的整体结构。
- 代码复用:通过将算法的公共部分放在基类中,可以实现代码复用,减少重复代码。
应用场景
模板方法模式常用于以下情况:
- 需要定义一个操作的算法骨架,而将一些步骤的实现延迟到子类中。
- 不希望子类改变算法的结构,但允许它在某些步骤中提供具体实现。
- 需要共享和复用多个子类之间的代码。
二、模板方法模式的设计方法
template.cpp
#include <iostream>
#include <fstream>
#include <string>
// 抽象类
class FileProcessor {
public:
void processFile(const std::string& fileName) {
openFile(fileName);
readFile();
processData();
closeFile();
}
protected:
virtual void openFile(const std::string& fileName) = 0;
virtual void readFile() = 0;
virtual void processData() = 0;
virtual void closeFile() = 0;
};
// 具体子类 A:处理文本文件
class TextFileProcessor : public FileProcessor {
protected:
void openFile(const std::string& fileName) override {
std::cout << "打开文本文件: " << fileName << std::endl;
file.open(fileName);
if (file.is_open()) {
std::cout << "打开成功 " << std::endl;
}else {
std::cout << "打开失败 " << std::endl;
}
}
void readFile() override {
if (file.is_open()) {
std::getline(file, content);
std::cout << "阅读内容: " << content << std::endl;
}
}
void processData() override {
if (file.is_open())
std::cout << "处理文本文件内容." << std::endl;
}
void closeFile() override {
if (file.is_open()) {
file.close();
std::cout << "关闭文本文件." << std::endl;
}
}
private:
std::ifstream file;
std::string content;
};
// 具体子类 B:处理二进制文件
class BinaryFileProcessor : public FileProcessor {
protected:
void openFile(const std::string& fileName) override {
std::cout << "打开二进制文件: " << fileName << std::endl;
file.open(fileName, std::ios::binary);
if (file.is_open()) {
std::cout << "打开成功 " << std::endl;
}else {
std::cout << "打开失败 " << std::endl;
}
}
void readFile() override {
if (file.is_open()) {
std::getline(file, content);
std::cout << "阅读二进制文件内容." << content <<std::endl;
}
}
void processData() override {
if (file.is_open())
std::cout << "处理二进制文件数据." << std::endl;
}
void closeFile() override {
if (file.is_open()) {
file.close();
std::cout << "关闭二进制文件." << std::endl;
}
}
private:
std::ifstream file;
std::string content;
};
void doWorking() {
// 通过不同的子类重写父类的方法实现模式方法模式
FileProcessor* textProcessor = new TextFileProcessor();
FileProcessor* binaryProcessor = new BinaryFileProcessor();
textProcessor->processFile("example.txt");
binaryProcessor->processFile("example.bin");
delete textProcessor;
delete binaryProcessor;
return ;
}
int main() {
//start working
doWorking();
return 0;
}
运行效果
ps:模拟文本文件和二进制文件的处理过程。通过父类的指针指向子类对象,由子类对象重写父类方法,实现不同的文件处理过程。
三、总结
通过模板方法模式,我们可以确保算法的结构不被改变,同时允许子类提供具体的细节实现。