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

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

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

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

1.问题分析

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

2.实现步骤

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

3.代码示例

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

3.1.策略接口

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

3.2.具体策略类

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

3.3.上下文类

// 维护一个对策略对象的引用
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.调用算法

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;
}
http://www.lryc.cn/news/512713.html

相关文章:

  • SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法
  • 爬虫的工作原理
  • 你了解DNS吗?
  • 利用JavaScript实现顺序九宫格抽奖
  • 音视频入门知识(四):封装篇
  • 在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?
  • Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品
  • pthread.h互斥锁与原子操作
  • 网络基础入门到深入(3):网络协议-HTTP/S
  • Git的.gitignore文件详解与常见用法
  • UniApp 组件的深度运用
  • k8s部署nginx+sshd实现文件上传下载
  • Spring-Mybatis 2.0
  • Linux 的历史与发展:从诞生到未来
  • SQL Server实现将分组的其他字段数据拼接成一条数据
  • 学习笔记 --C#基础其他知识点(同步和异步)
  • 一维、线性卡尔曼滤波的例程(MATLAB)
  • 极品飞车6的游戏手柄设置
  • FreeRTOS Lwip Socket APi TCP Server 1对多
  • 逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略
  • KOI技术-事件驱动编程(Sping后端)
  • LVS 负载均衡原理 | 配置示例
  • Hive分区再分桶表
  • 从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)
  • Linux官文转载-- Linux 内核代码风格
  • Qt监控系统放大招/历经十几年迭代完善/多屏幕辅屏预览/多层级设备树/网络登录和回放
  • 【贪心算法】贪心算法七
  • LangChain教程 - 表达式语言 (LCEL) -构建智能链
  • 使用Locust对Redis进行负载测试
  • HIVE数据仓库分层