C++ 设计模式:策略模式(Strategy Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 模板方法
链接:C++ 设计模式 - 观察者模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端而变化。

1.问题分析

在开发中,经常会遇到需要在运行时选择不同算法或行为的情况。如果将这些算法直接嵌入到客户端代码中,会导致代码复杂且难以维护。策略模式通过将算法封装成独立的类,并通过接口进行调用,使得算法可以灵活地替换和扩展。

2.实现步骤

  1. 定义策略接口:定义一个接口,所有具体策略类都实现这个接口。
  2. 实现具体策略类:每个具体策略类实现策略接口,提供具体的算法实现。
  3. 上下文类:上下文类持有一个策略对象的引用,并通过策略接口调用具体的算法。

3.代码示例

以机器人的清洁任务作为示例。

3.1.策略接口

cpp 复制代码
// 定义机器人任务的公共接口
class CleaningStrategy {
 public:
  virtual ~CleaningStrategy() = default;
  virtual void clean() = 0;
};

3.2.具体策略类

cpp 复制代码
// 策略1,直线清洁
class LinearCleaningStrategy : public CleaningStrategy {
 public:
  void clean() override { std::cout << "Cleaning in a straight line." << std::endl; }
};
cpp 复制代码
// 策略2,螺旋清洁
class SpiralCleaningStrategy : public CleaningStrategy {
 public:
  void clean() override { std::cout << "Cleaning in a spiral pattern." << std::endl; }
};

3.3.上下文类

cpp 复制代码
// 维护一个对策略对象的引用
class CleaningRobot {
 public:
  void setStrategy(std::shared_ptr<CleaningStrategy> strategy) { this->strategy = strategy; }

  void performCleaning() {
    if (strategy) {
      strategy->clean();
    } else {
      std::cout << "No cleaning strategy set." << std::endl;
    }
  }

 private:
  std::shared_ptr<CleaningStrategy> strategy;
};

3.4.调用算法

cpp 复制代码
int main() {
  // 创建一个清洁机器人对象
  CleaningRobot robot;

  // 设置直线清洁策略
  std::shared_ptr<CleaningStrategy> linearStrategy = std::make_shared<LinearCleaningStrategy>();
  robot.setStrategy(linearStrategy);
  robot.performCleaning();

  // 设置螺旋清洁策略
  std::shared_ptr<CleaningStrategy> spiralStrategy = std::make_shared<SpiralCleaningStrategy>();
  robot.setStrategy(spiralStrategy);
  robot.performCleaning();

  return 0;
}
相关推荐
研究点啥好呢2 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
沫璃染墨2 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
计算机安禾3 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技3 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
无限进步_4 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
C++ 老炮儿的技术栈4 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
橘颂TA4 小时前
【笔试】算法的暴力美学——牛客 NC213140 :除2!
c++·算法·结构与算法
wsoz5 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组