模板方法模式通过基类定义算法骨架,将具体步骤延迟到子类实现。1. 基类使用virtual final函数固定流程顺序;2. 纯虚函数强制子类实现核心步骤;3. 普通虚函数提供默认或钩子行为;4. 子类仅重写所需方法;5. 可结合std::function运行时注入逻辑,兼顾继承与组合灵活性。
模板方法模式通过基类定义算法骨架,将具体步骤延迟到子类实现。C++中利用虚函数和模板机制能很好地封装流程,同时保留扩展性。
定义抽象基类封装流程结构
在基类中使用虚函数定义不可重写的模板方法,该方法固定调用顺序,部分步骤由纯虚函数预留子类实现。
- 模板方法声明为 virtual final 防止被覆盖
- 变化的步骤用 纯虚函数 定义接口
- 可选步骤可用普通虚函数提供默认实现
class ProcessTemplate { public: virtual void execute() final { // 固定流程 step1(); step2(); if (needStep3()) { step3(); } step4(); } protected: virtual void step1() = 0; // 必须实现 virtual void step2() = 0; virtual bool needStep3() { // 钩子函数,可选 return true; } virtual void step3() = 0; virtual void step4() { // 默认空实现 // 可选后处理 } };
子类实现具体步骤
继承基类并实现对应的虚函数,无需关心执行顺序,只需专注逻辑细节。
- 每个子类可定制不同行为
- 钩子函数控制流程分支
- 避免重复编写流程控制代码
class ConcreteProcess : public ProcessTemplate { protected: void step1() override { // 具体初始化 } void step2() override { // 数据处理 } void step3() override { // 特殊校验 } bool needStep3() override { return false; // 关闭第三步 } };
结合函数对象提升灵活性
对某些步骤支持传入函数对象或lambda,运行时动态指定行为。
立即学习“C++免费学习笔记(深入)”;
“`cpp class FlexibleTemplate { std::function
public: explicit FlexibleTemplate(std::function<void()> fn) : customStep(std::move(fn)) {}
void execute() final { step1(); if (customStep) customStep(); step2(); }
private: void step1() { / 固定逻辑 / } void step2() { / 固定逻辑 / } };
基本上就这些。通过继承+虚函数定义标准流程,配合钩子和回调,既能统一控制结构,又保持足够的可扩展性。
c++ 封装 子类 void Lambda 继承 虚函数 纯虚函数 接口 class public private function 对象 算法