模板方法模式(c++实现)
模板方法模式
模式定义
模板方法模式(Template Function),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模式动机
- 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
- 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复代码都应该要上升到父类去,而不是让每个子类都去重复。
UML类图
源码实现
- abstractclass.h
class AbstractClass
{
public:
AbstractClass();
virtual ~AbstractClass();
void MethodA();
virtual int MethodB(int a = 0, int b = 0);
};
- abstractclass.cpp
#include "abstractclass.h"
#include <iostream>
AbstractClass::AbstractClass()
{
}
AbstractClass::~AbstractClass()
{
}
void AbstractClass::MethodA()
{
std::cout << __FUNCTION__ << " Call method b :" << this->MethodB(5, 4) << std::endl;
}
int AbstractClass::MethodB(int a, int b)
{
return a + b;
}
- concreteclassa.h
#include "abstractclass.h"
class ConcreteClassA : public AbstractClass
{
public:
ConcreteClassA();
int MethodB(int a = 0, int b = 0) override;
};
- concreteclassa.cpp
#include "concreteclassa.h"
ConcreteClassA::ConcreteClassA()
{
}
int ConcreteClassA::MethodB(int a, int b)
{
return a * b;
}
- concreteclassb.h
#include "concreteclassb.h"
ConcreteClassB::ConcreteClassB()
{
}
int ConcreteClassB::MethodB(int a, int b)
{
return a - b;
}
- concreteclassb.cpp
#include "concreteclassb.h"
ConcreteClassB::ConcreteClassB()
{
}
int ConcreteClassB::MethodB(int a, int b)
{
return a - b;
}
- main.cpp
#include <iostream>
#include "concreteclassa.h"
#include "concreteclassb.h"
using namespace std;
int main()
{
ConcreteClassA* classA = new ConcreteClassA();
classA->MethodA();
ConcreteClassB* classB = new ConcreteClassB();
classB->MethodA();
return 0;
}
- 运行结果
MethodA Call method b :20
MethodA Call method b :1
优点
模板方法模式的优点
- 通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
- 提供了一个很好的代码复用的平台。
- 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
缺点
模式的缺点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?