当前位置: 首页 > article >正文

C++ 设计模式:模板方法(Template Method)

链接:C++ 设计模式
链接:C++ 设计模式 - 策略模式
链接:C++ 设计模式 - 观察者模式

模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这种方式,子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。

1.问题分析

在开发中,经常会遇到一些操作,它们的整体步骤是固定的,但其中某些步骤的实现是可变的。模板方法通过将这些可变的步骤抽象出来,使得子类可以灵活地实现这些步骤,而不需要修改整体的算法结构。

2.实现步骤

  1. 定义抽象基类:在抽象基类中定义算法的骨架,并将可变的步骤声明为纯虚函数。
  2. 实现具体子类:在具体子类中实现这些可变的步骤。
  3. 调用算法:通过基类接口调用算法,具体的实现由子类提供。

3.代码示例

以机器人任务作为示例

3.1.抽象基类

class Robot {
 public:
  virtual ~Robot() = default;
  void performTask() {
    start();
    doTask();
    stop();
  }

 protected:
  void start() { std::cout << "Starting the robot" << std::endl; }
  void stop() { std::cout << "Stopping the robot" << std::endl; }
  // 抽象步骤,由子类实现
  virtual void doTask() = 0;
};

3.2.具体子类

// 具体机器人1,清扫机器人
class CleaningRobot : public Robot {
 protected:
  void doTask() override { std::cout << "Cleaning the floor" << std::endl; }
};
// 具体机器人2,巡逻机器人
class PatrollingRobot : public Robot {
 protected:
  void doTask() override { std::cout << "Patrolling the area" << std::endl; }
};

3.3.调用算法

int main() {
  CleaningRobot cleaningRobot;
  PatrollingRobot patrollingRobot;

  std::cout << "Cleaning robot task..." << std::endl;
  cleaningRobot.performTask();

  std::cout << "\nPatrolling robot task..." << std::endl;
  patrollingRobot.performTask();

  return 0;
}

模板方法模式是通过继承的方式,将算法的骨架定义在抽象类中,而具体步骤由子类实现。适用于算法步骤固定,但某些步骤需要定制的场景。


http://www.kler.cn/a/458901.html

相关文章:

  • 【prometheus】【blackbox_exporter】grafna导入blackbox_exporter看板配置
  • Windows安装Confluence详解
  • Springboot使用RabbitMQ实现关闭超时订单的一个简单示例
  • 鸿蒙应用开发(1)
  • 关于easy-es对时间范围查询遇到的小bug
  • Windows安装了pnpm后无法在Vscode中使用
  • Zookeeper中version-2目录下存放数据
  • 生态碳汇涡度相关监测与通量数据分析实践技术应用
  • mysql一个表只能由一个自动递增列吗
  • CKA认证 | Day7 K8s存储
  • 封装一个自己的JS或TS库,并发布到npm上
  • 网络基础入门到深入(2):网络协议-TCP/IP协议栈
  • PowerShell 常见问题解答
  • 深度学习工作:从追求 SoTA 到揭示新现象
  • 数据库的概念和操作
  • Mysql高级
  • 天通卫星技术,保障无信号区域的高效通信与监测
  • C++笔记4:C和C++混合编程,C不能识别C++的类内函数编译报错怎么办
  • 【优选算法】Sliding-Chakra:滑动窗口的算法流(下)
  • 【uni-app】微信小程序使用lime-painter生成海报
  • 区块链安全常见的攻击分析——私有数据泄露 (Private Data Exposure)【7】
  • Javascript数据结构——图Graph
  • C++ 设计模式:代理模式(Proxy Pattern)
  • 力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
  • 代码随想录day21 | leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III
  • [图形渲染]【Unity Shader】【游戏开发】 Shader数学基础17-法线变换基础与应用