首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
数据库
›
分布式数据库
›
C++ 模板方法模式详解
返回列表
发新帖
C++ 模板方法模式详解
[复制链接]
发表于 2025-9-10 17:04:07
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
模板方法模式(Template Method Pattern)是一种行为操持模式,它在
父类中定义算法的框架
,而将一些步调的
详细实现延迟到子类
中,使得子类可以不改变算法布局的情况下重定义某些特定步调。
核心概念
操持原则
模板方法模式遵照以下操持原则:
好莱坞原则
:"不要调用我们,我们会调用你" - 父类控制流程,子类提供实现
开闭原则
:对扩展开放(通过子类化),对修改关闭(不修改算法布局)
单一职责原则
:将可变部分分离到差别方法中
主要长处
代码
复用
:将公共行为放在父类中
反向控制
:父类控制流程,子类提供细节
机动性
:可以覆盖特定步调而不改变布局
扩展性
:容易添加新的详细实现
模式布局
主要组件
AbstractClass(抽象类)
定义模板方法和抽象的根本操纵
模板方法调用根本操纵完成算法
ConcreteClass(详细类)
实现抽象类定义的根本操纵
可以覆盖某些默认实现
完整
代码
示例
#include <iostream>
#include <memory>
#include <string>
// ==================== 抽象类 ====================
class DataProcessor {
protected:
// 基本操作 - 由子类实现
virtual void readData() = 0;
virtual void processData() = 0;
virtual void writeData() = 0;
// 钩子方法 - 可选覆盖
virtual bool shouldValidate() const { return true; }
virtual void validateData() {
std::cout << "默认数据验证..." << std::endl;
}
// 具体方法 - 公共实现
void openConnection() {
std::cout << "打开
数据库
连接..." << std::endl;
}
void closeConnection() {
std::cout << "关闭
数据库
连接..." << std::endl;
}
public:
// 模板方法 - 定义算法框架
void process() {
openConnection();
readData();
if (shouldValidate()) {
validateData();
}
processData();
writeData();
closeConnection();
}
virtual ~DataProcessor() = default;
};
// ==================== 具体类 ====================
class CsvDataProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "从CSV文件读取数据..." << std::endl;
}
void processData() override {
std::cout << "处理CSV数据..." << std::endl;
}
void writeData() override {
std::cout << "将处理结果写入CSV文件..." << std::endl;
}
bool shouldValidate() const override {
return false; // CSV数据不需要验证
}
};
class DatabaseDataProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "从
数据库
读取数据..." << std::endl;
}
void processData() override {
std::cout << "处理数据库数据..." << std::endl;
}
void writeData() override {
std::cout << "将处理结果写入数据库..." << std::endl;
}
void validateData() override {
std::cout << "执行严格的数据验证..." << std::endl;
}
};
class ApiDataProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "从
API
获取数据..." << std::endl;
}
void processData() override {
std::cout << "处理
API
数据..." << std::endl;
}
void writeData() override {
std::cout << "将处理结果通过
API
发送..." << std::endl;
}
bool shouldValidate() const override {
return true;
}
void openConnection() { // 覆盖具体方法
std::cout << "初始化API连接..." << std::endl;
}
void closeConnection() { // 覆盖具体方法
std::cout << "终止API连接..." << std::endl;
}
};
// ==================== 客户端
代码
====================
int main() {
std::cout << "=== 模板方法模式演示: 数据处理流程 ===" << std::endl;
std::cout << "\n处理CSV数据:" << std::endl;
CsvDataProcessor csvProcessor;
csvProcessor.process();
std::cout << "\n处理数据库数据:" << std::endl;
DatabaseDataProcessor dbProcessor;
dbProcessor.process();
std::cout << "\n处理API数据:" << std::endl;
ApiDataProcessor apiProcessor;
apiProcessor.process();
return 0;
}
复制代码
模式变体
1. 使用钩子方法
class DocumentExporter {
protected:
virtual void prepareData() = 0;
virtual void generateFile() = 0;
// 钩子方法 - 可选步骤
virtual bool shouldCompress() const { return false; }
virtual void compressFile() {
std::cout << "使用默认压缩算法压缩文件..." << std::endl;
}
public:
void exportDocument() {
prepareData();
generateFile();
if (shouldCompress()) {
compressFile();
}
}
};
复制代码
2. 模板方法与战略模式结合
// 策略接口
class ValidationStrategy {
public:
virtual void validate() = 0;
virtual ~ValidationStrategy() = default;
};
// 模板方法抽象类
class ReportGenerator {
std::unique_ptr<ValidationStrategy> validationStrategy_;
protected:
virtual void fetchData() = 0;
virtual void formatReport() = 0;
void validateData() {
if (validationStrategy_) {
validationStrategy_->validate();
}
}
public:
void setValidationStrategy(std::unique_ptr<ValidationStrategy> strategy) {
validationStrategy_ = std::move(strategy);
}
void generate() {
fetchData();
validateData();
formatReport();
}
};
复制代码
实际应用场景
框架操持
:定义算法框架,允许用户自定义部分步调
数据处置惩罚流程
:如示例中的数据读取-处置惩罚-写入流程
游戏开发
:游戏循环的固定流程
编译器
:编译流程中的固定步调
测试框架
:测试用例的执行流程
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复
使用道具
举报
返回列表
铁佛
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表