模板方法模式
模式定义
- 定义一个操作中的算法的骨架,将算法的实现步骤延迟到子类中。模板方法使得一个子类可以不改变一个算法的结构即可重定义该算法的特定步骤
UML 类图
使用场景
- 当我们要完成在某一个细节层次一致的过程或者一系列步骤时,但个别步骤在更详细的层次上的实现可能不同时,通常可以考虑使用模板方法处理
- 重复代码在父类中实现,通过继承的方式让子类调用
优缺点
优点
- 将不变的行为搬移到父类,去除父类的重复代码来体现它的优势
- 提供一个很好的代码复用的平台
- 当不变的和可变的行为在方法的子类实现中混用在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬迁到单一的地方,帮助子类摆脱重复的不变行为的纠缠。
缺点
- 由于模板方法中的算法细节在子类中实现,所以子类的行为影响了父类。在复杂的项目中,会导致代码阅读困难
源码实现
#include<iostream>
#include<cstdio>
using namespace std;
class AbstractClass
{
public:
~AbstractClass(){}
void templateMethod(){
this->primitiveOperation1();
this->primitiveOperation2();
}
virtual void primitiveOperation1() = 0;
virtual void primitiveOperation2() = 0;
protected:
AbstractClass(){}
};
class ConcreteClassA : public AbstractClass
{
private:
public:
ConcreteClassA(){}
~ConcreteClassA(){}
virtual void primitiveOperation1(){
cout << "ConcreteClassA " << __func__ << endl;
}
virtual void primitiveOperation2(){
cout << "ConcreteClassA " << __func__ << endl;
}
};
class ConcreteClassB : public AbstractClass
{
private:
public:
ConcreteClassB(){}
~ConcreteClassB(){}
virtual void primitiveOperation1(){
cout << "ConcreteClassB " << __func__ << endl;
}
virtual void primitiveOperation2(){
cout << "ConcreteClassB " << __func__ << endl;
}
};
int main(){
AbstractClass *pAbstract = new ConcreteClassA();
pAbstract->templateMethod();
pAbstract = new ConcreteClassB();
pAbstract->templateMethod();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!