策略模式 - 策略模式的使用

引言

在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端而变化。本文将详细介绍策略模式的概念、结构、实现以及在C++中的应用。

策略模式的概念

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。换句话说,策略模式允许在运行时选择算法的行为,而不是在编译时。

策略模式的结构

策略模式通常包含以下几个角色:

  1. Context(上下文):持有一个策略类的引用,用于调用具体的策略。
  2. Strategy(策略):定义所有支持的算法的公共接口。
  3. 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;
}

策略模式的优点

  1. 灵活性:策略模式允许在运行时动态选择算法,使得系统更加灵活。
  2. 可扩展性:新增策略类不会影响现有的代码,符合开闭原则。
  3. 代码复用:策略模式将算法封装在独立的类中,便于复用。

策略模式的缺点

  1. 增加类的数量:每个策略都需要一个独立的类,可能会增加类的数量。
  2. 客户端需要了解策略:客户端需要知道所有可用的策略,并选择合适的策略。

总结

策略模式是一种非常有用的设计模式,特别适用于需要在运行时选择算法的场景。通过将算法封装在独立的类中,策略模式使得系统更加灵活和可扩展。在C++中,策略模式可以通过定义策略接口、实现具体策略类以及使用上下文类来轻松实现。希望本文能帮助你理解并应用策略模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调试手段。 一、什么是pr…

设计模式:春招面试的关键知识储备

在之前的文章中&#xff0c;我们深入探讨了分布式事务&#xff0c;了解了它在分布式系统中的重要性以及常见的解决方案。而在软件开发领域&#xff0c;设计模式是提升代码质量、可维护性和可扩展性的关键要素。设计模式是对软件开发中反复出现的问题的通用解决方案&#xff0c;…

上位机知识篇---Linux的shell脚本搜索、查找、管道

文章目录 前言第一部分&#xff1a;什么是shell&#xff1f;1. 基本结构脚本声明注释命令和表达式例子 2.变量控制结构条件判断 3.函数输入输出重定向 4.执行命令5.实际应用 第二部分&#xff1a;Linux的搜索、查找、管道命令1.搜索命令2.查找命令3.管道操作 总结 前言 以上就…

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册&#xff0c;新建自定义机器人&#xff0c;并记录好webhook地址&#xff0c;后续将在配置文件中更新该地址。 可以先完成到后续步骤之前&#xff0c;后续的步骤与安全相关&…

混合专家模型MoE的全面详解

什么是混合专家&#xff08;MoE&#xff09;&#xff1f; 混合专家&#xff08;MoE&#xff09;是一种利用多个不同的子模型&#xff08;或称为“专家”&#xff09;来提升LLM质量的技术。 MoE的两个主要组成部分是&#xff1a; 专家&#xff1a;每个前馈神经网络&#xff08…

基于Arcsoft的人脸识别

目录 一、前言 二、使用方法 三、获取SDK 四、人脸检测/人脸识别 五、代码实现 一、前言 face++,百度ai,虹软,face_recognition,其中除了face_recognition是python免费的一个库安装好响应的库直接运行就好,另外三个需要填入相关申请的信息id和key。 分别对应着相应的人…

电梯系统的UML文档13

5.2.6 CarPositionControl 的状态图 图 24: CarPositionControl 的状态图 5.2.7 Dispatcher 的状态图 图 25: Dispatcher 的状态图 5.3 填补从需求到状态图鸿沟的实用方法 状态图能对类的行为&#xff0c;一个用例&#xff0c;或系统整体建模。在本文中&#xff0c;状态图…

自动化运维在云环境中的完整实践指南

随着云计算的普及,越来越多的企业将业务迁移到云上。云环境的高动态性和复杂性使得传统的手动运维方式难以应对,自动化运维成为提升效率、降低成本、保障系统稳定性的关键。本文将详细介绍如何在云环境中实施自动化运维,涵盖工具选择、实施步骤和最佳实践。 © ivwdcwso…

性能测试丨分布式性能监控系统 SkyWalking

软件测试领域&#xff0c;分布式系统的复杂性不断增加&#xff0c;如何保证应用程序的高可用性与高性能&#xff0c;这是每一个软件测试工程师所面临的重大挑战。幸运的是&#xff0c;现在有了一些强大的工具来帮助我们应对这些挑战&#xff0c;其中之一便是Apache SkyWalking。…

Ollama windows安装

Ollama 是一个开源项目&#xff0c;专注于帮助用户本地化运行大型语言模型&#xff08;LLMs&#xff09;。它提供了一个简单易用的框架&#xff0c;让开发者和个人用户能够在自己的设备上部署和运行 LLMs&#xff0c;而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…

留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB

您列出了一系列编程语言和技术&#xff0c;这些可能是您在留学期间需要学习或完成作业的内容。以下是对每个项目的简要说明和它们可能涉及的领域或用途&#xff1a; Scratch&#xff1a; Scratch是一种图形化编程语言&#xff0c;专为儿童和初学者设计&#xff0c;用于教授编程…

C++二叉树进阶

1.二叉搜索树 1.1二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者具有以下性质的二叉树 若它的左子树不为空&#xff0c;则左子树上所有结点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值…

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal&#xff0c;选择版本后点击“install”执行安装

2. Java-MarkDown文件解析-工具类

2. Java-MarkDown文件解析-工具类 1. 思路 读取markdown文件的内容&#xff0c;根据markdown的语法进行各个类型语法的解析。引入工具类 commonmark 和 commonmark-ext-gfm-tables进行markdown语法解析。 2. 工具类 pom.xml <!-- commonmark 解析markdown --> <d…

常用符号的英语表达

plus 加号&#xff1b;正号 -  minus 减号&#xff1b;负号  plus or minus 正负号  is multiplied by 乘号  is divided by 除号 &#xff1d; is equal to 等于号 ≠ is not equal to 不等于号 ≡ is equivalent to 全等于号 ≌ is equal to or approximatel…

青少年编程与数学 02-008 Pyhon语言编程基础 02课题、基础概念

青少年编程与数学 02-008 Pyhon语言编程基础 02课题、基础概念 一、标识符二、关键字三、字面量四、变量五、运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 赋值运算符5. 成员运算符6. 身份运算符 六、表达式七、语句八、注释单行注释多行注释文档字符串&#xff08;Docstr…

lanqiaoOJ 2145:求阶乘 ← 二分法

【题目来源】 https://www.lanqiao.cn/problems/2145/learning/ 【题目描述】 满足 N&#xff01;的末尾恰好有 K 个 0 的最小的 N 是多少&#xff1f; 如果这样的 N 不存在输出 -1。 【输入格式】 一个整数 K。 【输出格式】 一个整数代表答案。 【输入样例】 2 【输出样…

vs2013 使用 eigen 库编译时报 C2059 错的解决方法

&#xff08;个人感觉&#xff09;vs2013 就不能使用版本大于等于 3.4 的 eigen&#xff0c;使用 3.3.9 就可以了&#xff0c;再不行就用 3.3.8 另一个博主也遇到过用 vs2013 的时候不能编译 3.4 的 eigen 的问题&#xff0c;不过我用的是 win11&#xff0c;所以感觉跟操作系统…

U盘打开提示格式化:深度解析与数据恢复全攻略

在数字化时代&#xff0c;U盘作为便捷的数据存储和传输工具&#xff0c;广泛应用于各个领域。然而&#xff0c;当我们满怀期待地插入U盘&#xff0c;却遭遇“U盘打开提示格式化”的尴尬局面时&#xff0c;那份焦虑与无助感油然而生。本文将全面剖析U盘打开提示格式化的原因、应…