c++如何实现一个模板方法模式_c++行为型设计模式Template Method【框架】

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

模板方法模式在C++中通过抽象基类定义算法骨架,将可变步骤延迟到子类实现——核心是用虚函数(尤其是纯虚)封装变化点,用final修饰模板方法防止重写

定义抽象模板类:声明算法流程与钩子

在基类中用public virtual声明模板方法(通常加final),用protected pure virtual声明子类必须实现的步骤,再用protected virtual提供可选重写的钩子函数:

  • 模板方法本身不带实现,只调用其他虚函数,体现“骨架不变”
  • 纯虚函数强制子类定制关键逻辑,如doStep1()doStep2()
  • 普通虚函数(如isLoggingEnabled())默认返回false,子类按需覆盖

子类实现具体步骤:只重写虚函数,不改流程

继承抽象类后,只需实现纯虚函数,其余逻辑(如预处理、后置校验、异常包装)由父类统一控制:

  • 避免复制粘贴整个算法,也不需要调用super——C++无此语法,靠父类模板方法自动调度
  • 若某步在所有子类中逻辑相同,可在基类提供默认实现(非纯虚),子类选择性override
  • 注意构造顺序:基类构造时虚函数调用不会动态绑定,确保步骤函数不在构造/析构中被意外调用

支持编译期多态(可选):CRTP优化性能

对性能敏感场景,可用CRTP(奇异递归模板模式)替代虚函数调用,把“子类类型”作为模板参数传入基类:

  • 基类template class AlgorithmBase中,用static_cast(this)->stepImpl()调用
  • 完全消除虚表开销,但失去运行时多态能力(不能存为AlgorithmBase*统一管理)
  • 适合算法固定、子类数量少且编译期可知的框架内部组件

基本上就这些。模板方法不是为了炫技,而是当多个类共享相同执行流程、仅局部步骤不同时,把它从重复代码里“提出来”——父类管顺序,子类管内容。