策略模式 - 策略模式的使用
引言
在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端而变化。本文将详细介绍策略模式的概念、结构、实现以及在C++中的应用。
策略模式的概念
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。换句话说,策略模式允许在运行时选择算法的行为,而不是在编译时。
策略模式的结构
策略模式通常包含以下几个角色:
- Context(上下文):持有一个策略类的引用,用于调用具体的策略。
- Strategy(策略):定义所有支持的算法的公共接口。
- ConcreteStrategy(具体策略):实现策略接口的具体算法。
策略模式的实现
下面我们通过一个简单的例子来演示如何在C++中实现策略模式。
示例:排序策略
假设我们有一个应用程序,需要对一组数据进行排序。我们可以使用不同的排序算法(如冒泡排序、快速排序等)来实现排序功能。通过策略模式,我们可以在运行时选择使用哪种排序算法。
1. 定义策略接口
首先,我们定义一个策略接口 SortStrategy,它包含一个纯虚函数 sort,用于执行排序操作。
class SortStrategy {
public:virtual void sort(std::vector<int>& data) = 0;virtual ~SortStrategy() = default;
};
2. 实现具体策略
接下来,我们实现两个具体的排序策略:BubbleSortStrategy 和 QuickSortStrategy。
class BubbleSortStrategy : public SortStrategy {
public:void sort(std::vector<int>& data) override {// 实现冒泡排序算法for (size_t i = 0; i < data.size(); ++i) {for (size_t j = 0; j < data.size() - i - 1; ++j) {if (data[j] > data[j + 1]) {std::swap(data[j], data[j + 1]);}}}}
};class QuickSortStrategy : public SortStrategy {
public:void sort(std::vector<int>& data) override {// 实现快速排序算法quickSort(data, 0, data.size() - 1);}private:void quickSort(std::vector<int>& data, int low, int high) {if (low < high) {int pivot = partition(data, low, high);quickSort(data, low, pivot - 1);quickSort(data, pivot + 1, high);}}int partition(std::vector<int>& data, int low, int high) {int pivot = data[high];int i = low - 1;for (int j = low; j < high; ++j) {if (data[j] < pivot) {++i;std::swap(data[i], data[j]);}}std::swap(data[i + 1], data[high]);return i + 1;}
};
3. 定义上下文类
然后,我们定义一个上下文类 SortContext,它持有一个 SortStrategy 的指针,并在需要时调用具体的排序策略。
class SortContext {
public:SortContext(SortStrategy* strategy) : strategy_(strategy) {}void setStrategy(SortStrategy* strategy) {strategy_ = strategy;}void executeSort(std::vector<int>& data) {strategy_->sort(data);}private:SortStrategy* strategy_;
};
4. 使用策略模式
最后,我们可以在客户端代码中使用策略模式来动态选择排序算法。
int main() {std::vector<int> data = {5, 2, 9, 1, 5, 6};BubbleSortStrategy bubbleSort;QuickSortStrategy quickSort;SortContext context(&bubbleSort);context.executeSort(data);std::cout << "Bubble Sort Result: ";for (int num : data) {std::cout << num << " ";}std::cout << std::endl;context.setStrategy(&quickSort);context.executeSort(data);std::cout << "Quick Sort Result: ";for (int num : data) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
策略模式的优点
- 灵活性:策略模式允许在运行时动态选择算法,使得系统更加灵活。
- 可扩展性:新增策略类不会影响现有的代码,符合开闭原则。
- 代码复用:策略模式将算法封装在独立的类中,便于复用。
策略模式的缺点
- 增加类的数量:每个策略都需要一个独立的类,可能会增加类的数量。
- 客户端需要了解策略:客户端需要知道所有可用的策略,并选择合适的策略。
总结
策略模式是一种非常有用的设计模式,特别适用于需要在运行时选择算法的场景。通过将算法封装在独立的类中,策略模式使得系统更加灵活和可扩展。在C++中,策略模式可以通过定义策略接口、实现具体策略类以及使用上下文类来轻松实现。希望本文能帮助你理解并应用策略模式。
相关文章:
策略模式 - 策略模式的使用
引言 在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端…...
具身智能研究报告
参考: (1)GTC大会&Figure:“具身智能”奇点已至 (2)2024中国具身智能创投报告 (3)2024年具身智能产业发展研究报告 (4)具身智能行业深度:发展…...
Windows安装Milvus
安装Milvus 安装Docker前置条件: 安装Mlivus方案一方案二 Attu管理端 安装Docker 系统:Windows 11 家庭中文版 Mlivus:V2.3.0 Attu: V2.3.10 前置条件: 启用“适用于 Linux 的 Windows 子系统”可选功能,才能在 Win…...
Excel分区间统计分析(等步长、不等步长、多维度)
在数据分析过程中,可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计,本文从excel函数到数据透视表的方法,从简单需求到复杂需求,采用不同的方法进行讲解,尤其是通过数据透视表的强大功能大…...
宝塔mysql数据库容量限制_宝塔数据库mysql-bin.000001占用磁盘空间过大
磁盘空间占用过多,排查后发现网站/www/wwwroot只占用7G,/www/server占用却高达8G,再深入排查发现/www/server/data目录下的mysql-bin.000001和mysql-bin.000002两个日志文件占去了1.5G空间。 百度后学到以下知识,做个记录。 mysql…...
LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版
【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版 文章目录 【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚…...
多人-多agent协同可能会挑战维纳的反馈
在多人-多Agent协同系统中,维纳的经典反馈机制将面临新的挑战,而协同过程中的“算计”(策略性决策与协调)成为实现高效协作的核心。 1、非线性与动态性 维纳的反馈理论(尤其是在控制理论中)通常假设系统的动…...
Go学习:类型转换需注意的点 以及 类型别名
目录 1. 类型转换 2. 类型别名 1. 类型转换 在从前的学习中,知道布尔bool类型变量只有两种值true或false,C/C、Python、JAVA等编程语言中,如果将布尔类型bool变量转换为整型int变量,通常采用 “0为假,非0为真”的方…...
C语言中的局部变量和全局变量有什么区别?
在C语言中,局部变量和全局变量是两种具有不同作用域和存储期的变量。以下是它们之间的主要区别: 作用域 局部变量: 局部变量是在函数内部声明的变量。它们的作用域仅限于声明它们的函数内部。一旦函数执行完毕,局部变量就会超出…...
价值交换到底在交换什么
有人十多岁就很清醒,知道自己想要什么,要付出什么。有人20多岁清醒了,有人30多岁都不一定明白。 价值交换,四个字其实就可以解释大部分事情。价值交换和努力工作,勤劳没有任何关系。甚至努力和成功都不存在关系。 价值…...
C++传送锚点的内存寻址:内存管理
文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...
Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手
大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 许多人可能会跟老六哥一样,有过这样的体验:当我们遇到一个能力出众或对事物有独到见解的…...
基于django的智能停车场车辆管理深度学习车牌识别系统
完整源码项目包获取→点击文章末尾名片!...
【Proteus仿真】【51单片机】简易计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后,LCD1602显示数据,通过矩阵按键…...
洛谷P3884 [JLOI2009] 二叉树问题(详解)c++
题目链接:P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:从8走向6的最短路径,向根节点就是向上走,从8到1会经过三条边,向叶节点就是向下走,从1走到6需要经过两条边,…...
《Foundation 起步》
《Foundation 起步》 引言 Foundation 是一个广泛使用的开源前端框架,由 ZURB 团队创建。它旨在帮助开发者构建响应式、可访问性和移动优先的网页。本文将为您提供一个全面的指南,帮助您从零开始学习并使用 Foundation。 Foundation 简介 什么是 Foundation? Foundatio…...
【hot100】刷题记录(6)-轮转数组
题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…...
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …...
ThinkPad E480安装Ubuntu 18.04无线网卡驱动
个人博客地址:ThinkPad E480安装Ubuntu 18.04无线网卡驱动 | 一张假钞的真实世界 遗憾的是虽然下面的方法可以解决,但是内核升级后需要重新安装。 基本信息 Ubuntu 18.04ThinkPad E480使用下面的命令查看 Linux 内核: $ uname -r 5.0.0-3…...
自然语言处理——从原理、经典模型到应用
1. 概述 自然语言处理(Natural Language Processing,NLP)是一门借助计算机技术研究人类语言的科学,是人工智能领域的一个分支,旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…...
AI智能体记忆系统构建指南:从向量检索到混合搜索的工程实践
1. 项目概述:构建一个能“记住”的智能体最近在折腾AI智能体(Agent)开发的朋友,估计都遇到过同一个头疼的问题:这玩意儿怎么跟金鱼似的,聊两句就忘?你让它帮你整理一份周报,它吭哧吭…...
【工业视觉】基于序列图像动态特征提取的熔炼结晶过程建模与量化分析
1. 工业视觉在熔炼结晶过程中的核心价值 我第一次接触工业视觉在熔炼结晶中的应用是在2018年一个铜冶炼项目。当时工厂老师傅们还在用肉眼观察结晶状态,不仅效率低下,而且不同操作员的判断标准差异能达到15%。这种主观性带来的工艺波动直接影响了产品质量…...
从数据到角度:手把手调试大疆C板BMI088,解决姿态解算精度跳动的那些坑
从数据到角度:手把手调试大疆C板BMI088,解决姿态解算精度跳动的那些坑 调试嵌入式系统中的传感器数据,尤其是姿态解算这类对精度要求极高的应用,往往需要开发者具备跨领域的知识储备和丰富的实战经验。本文将分享我在使用大疆C板搭…...
OpenClaw-RUH:基于深度学习的机器人灵巧抓取框架解析与实践
1. 项目概述:当AI遇上“机械爪”最近在AI和机器人交叉的圈子里,一个名为“OpenClaw-RUH”的项目引起了我的注意。乍一看这个标题,你可能会觉得它又是一个开源的机械臂控制项目。但当我深入其代码仓库和社区讨论后,发现它的野心远不…...
超越‘点亮出图’:深入Sensor AE增益配置的三种模式与实战验证(以SC230AI/OV08A10/IMX335为例)
超越“点亮出图”:深入Sensor AE增益配置的三种模式与实战验证 在嵌入式Camera开发领域,成功点亮Sensor并输出图像仅仅是万里长征的第一步。真正的挑战往往出现在图像质量调优阶段,尤其是自动曝光(AE)与增益配置这一专…...
为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken解决API密钥不稳定与Token不足问题 应用场景类,许多开发者使用Claude Code作为编程助手但常…...
突破性创新:Midscene.js如何用AI视觉驱动重塑跨平台自动化测试
突破性创新:Midscene.js如何用AI视觉驱动重塑跨平台自动化测试 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今复杂的软件生态中,跨…...
Compose-Skill:为Jetpack Compose应用注入AI能力的组件化技能库
1. 项目概述:一个为Compose应用注入AI能力的技能库最近在折腾Jetpack Compose项目时,我一直在想,能不能让UI开发也“智能”一点?比如,用户输入一段模糊的描述,界面就能自动生成对应的组件布局;或…...
Haystack框架实战:从零构建企业级智能问答系统
1. 项目概述:一个为构建智能搜索与问答系统而生的框架如果你正在为海量文档构建一个能“理解”问题并“找到”答案的智能系统,比如一个公司内部的知识库助手,或者一个能检索技术文档并给出精准回复的客服机器人,那么你很可能已经听…...
如何使用Redis优化Trigger.dev任务队列:提升AI工作流性能的完整指南
如何使用Redis优化Trigger.dev任务队列:提升AI工作流性能的完整指南 【免费下载链接】trigger.dev Trigger.dev – build and deploy fully‑managed AI agents and workflows 项目地址: https://gitcode.com/gh_mirrors/tr/trigger.dev Trigger.dev是一个强…...
