模板方法模式通过抽象基类定义算法骨架,用纯虚函数强制子类实现变化步骤,用普通虚函数提供可选钩子,final修饰模板方法防止重写;CRTP可选替代虚函数以提升性能。

模板方法模式在C++中通过抽象基类定义算法骨架,将可变步骤延迟到子类实现——核心是用虚函数(尤其是纯虚)封装变化点,用final修饰模板方法防止重写。
定义抽象模板类:声明算法流程与钩子
在基类中用public virtual声明模板方法(通常加final),用protected pure virtual声明子类必须实现的步骤,再用protected virtual提供可选重写的钩子函数:
- 模板方法本身不带实现,只调用其他虚函数,体现“骨架不变”
- 纯虚函数强制子类定制关键逻辑,如
doStep1()、doStep2() - 普通虚函数(如
isLoggingEnabled())默认返回false,子类按需覆盖
子类实现具体步骤:只重写虚函数,不改流程
继承抽象类后,只需实现纯虚函数,其余逻辑(如预处理、后置校验、异常包装)由父类统一控制:
- 避免复制粘贴整个算法,也不需要调用
super——C++无此语法,靠父类模板方法自动调度 - 若某步在所有子类中逻辑相同,可在基类提供默认实现(非纯虚),子类选择性
override - 注意构造顺序:基类构造时虚函数调用不会动态绑定,确保步骤函数不在构造/析构中被意外调用
支持编译期多态(可选):CRTP优化性能
对性能敏感场景,可用CRTP(奇异递归模板模式)替代虚函数调用,把“子类类型”作为模板参数传入基类:
立即学习“C++免费学习笔记(深入)”;
- 基类
template中,用class AlgorithmBase static_cast调用(this)->stepImpl() - 完全消除虚表开销,但失去运行时多态能力(不能存为
AlgorithmBase*统一管理) - 适合算法固定、子类数量少且编译期可知的框架内部组件
基本上就这些。模板方法不是为了炫技,而是当多个类共享相同执行流程、仅局部步骤不同时,把它从重复代码里“提出来”——父类管顺序,子类管内容。









