模式特点
定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 父类定义算法骨架(template method),子类实现具体步骤
- 代码复用:通用逻辑在基类,差异逻辑在子类
- 控制反转:基类控制流程,子类提供实现
- 使用继承而非组合来实现
类图
应用场景
- Qt 中 QWidget::paintEvent 等事件处理函数由框架调用,子类实现具体绘制
- 机器人驱动开发:统一的初始化/通信/关闭流程,不同型号实现差异
- 应用程序框架:生命周期 init/start/stop 由框架定义
- 数据导入/导出:读取 → 解析 → 处理 → 输出的统一流程
- 测试框架:setUp → runTest → tearDown 模板流程
示例代码(C++)
// 抽象基类 - 机器人驱动 class RobotDriver { public: // 模板方法 - 定义算法骨架,final 防止子类修改 void connect() final { openDevice(); handshake(); loadParams(); if (needSelfTest()) selfTest(); // 钩子方法 std::cout << "连接完成" << std::endl; } protected: virtual void openDevice() = 0; virtual void handshake() = 0; virtual void loadParams() = 0; virtual void selfTest() { std::cout << "默认自检" << std::endl; } virtual bool needSelfTest() { return true; } }; // 具体类 - 新时达机器人 class XSTADriver : public RobotDriver { protected: void openDevice() override { std::cout << "打开以太网设备" << std::endl; } void handshake() override { std::cout << "TCP 握手" << std::endl; } void loadParams() override { std::cout << "加载新时达参数" << std::endl; } }; // 具体类 - 埃斯顿机器人 class EstunDriver : public RobotDriver { protected: void openDevice() override { std::cout << "打开串口设备" << std::endl; } void handshake() override { std::cout << "Modbus 握手" << std::endl; } void loadParams() override { std::cout << "加载埃斯顿参数" << std::endl; } bool needSelfTest() override { return false; } // 不需要自检 }; XSTADriver xsta; xsta.connect(); // 流程统一,实现各异 EstunDriver estun; estun.connect();