【C++设计模式】策略模式

news2025/1/11 16:54:15

文章目录

  • 前言
  • 一、策略模式是什么?
  • 二、策略模式的实现原理
  • 三、UML图
  • 四、代码实现
  • 总结


前言

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。通过将每个算法封装到具有共同接口的独立类中,客户端可以在不改变自身代码的情况下选择要使用的算法。这使得算法可以独立于客户端变化,易于维护和扩展。


一、策略模式是什么?

策略模式就像你在玩游戏时可以选择不同的角色,每个角色有自己独特的技能和特点一样。在编程中,策略模式允许你在不同的情况下选择使用不同的算法,而不需要修改你的代码。这意味着你可以轻松地切换算法,就像换角色一样。

适合类中的成员以方法为主,算法经常变动;简化了单元测试(因为每个 算法都有自己的类,可以通过自己的接口单独测试。
策略模式和简单工厂基本相同,但简单工厂模式只能解决对象创建问题,对于经常 变动的算法应使用策略模式。

二、策略模式的实现原理

在策略模式中,首先我们定义了一组算法,每个算法都被封装在自己的类里面。然后,我们定义一个统一的接口,使得这些算法类都能够被替换使用。这样,客户端就可以根据需要选择使用哪种算法,而不需要关心具体的实现细节。

当客户端需要使用某个算法时,它只需要将相应的算法对象传递给一个上下文对象。上下文对象负责将具体的算法委托给相应的算法对象来执行。这样一来,客户端与具体的算法解耦,可以轻松地切换和组合不同的算法,实现更灵活的功能。

三、UML图

在这里插入图片描述

Straregy作为ConcreteStrategyA和ConcreteStrategyB的父类
Context为环境类,他来设置指定的具体的决策

四、代码实现

#include <iostream>

// 抽象策略类
class Strategy {
public:
    virtual void execute() const = 0;
};

// 具体策略类 A
class ConcreteStrategyA : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing strategy A\n";
    }
};

// 具体策略类 B
class ConcreteStrategyB : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing strategy B\n";
    }
};

// 环境类
class Context {
private:
    Strategy* strategy_;

public:
    Context(Strategy* strategy) : strategy_(strategy) {}

    // 设置策略
    void setStrategy(Strategy* strategy) {
        strategy_ = strategy;
    }

    // 执行策略
    void executeStrategy() const {
        strategy_->execute();
    }
};

int main() {
    // 创建具体策略对象
    ConcreteStrategyA strategyA;
    ConcreteStrategyB strategyB;

    // 创建环境对象,并设置初始策略为 A
    Context context(&strategyA);

    // 执行当前策略
    context.executeStrategy();

    // 切换策略为 B,并执行
    context.setStrategy(&strategyB);
    context.executeStrategy();

    return 0;
}

在这里插入图片描述

这段代码实现了策略模式,其核心是将算法封装成独立的策略类,使得它们可以相互替换,从而使得算法可以独立于客户端而变化。

抽象策略类 Strategy:定义了一个纯虚函数 execute(),表示执行策略的方法。

具体策略类 ConcreteStrategyA 和 ConcreteStrategyB:分别实现了 execute() 方法,定义了具体的策略内容。

环境类 Context:持有一个策略对象的指针,在运行时可以动态地更改其所持有的策略对象。提供了设置策略和执行策略的方法。

在 main() 函数中,首先创建了具体策略对象 strategyA 和 strategyB,然后创建了环境对象 context,并将初始策略设置为 strategyA。接着执行当前策略,即执行了 strategyA 的 execute() 方法。然后,将环境对象的策略切换为 strategyB,并再次执行当前策略,即执行了 strategyB 的 execute() 方法。

这样,通过在不同的具体策略类中实现不同的算法,可以在运行时动态地切换不同的算法,从而实现不同的行为,这就是策略模式的核心原理。


总结

策略模式通过将算法封装到独立的类中,使得算法可以在运行时动态地切换和选择。这种灵活性使得策略模式成为一种强大的设计模式,特别适用于需要经常变化或者有多种选择的算法场景。通过使用策略模式,可以提高代码的灵活性、可维护性和可扩展性,使得系统更加健壮和可靠。

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:RelativeContainer)

相对布局组件&#xff0c;用于复杂场景中元素对齐的布局。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 规则说明 容器内子组件区分水平方向&#xff0c;垂直方向&#xff1a; 水平方向为left&…

ThingsBoard Edge 设备连接

文章目录 一、创建设备1.创建设备配置2.创建设备 二、上传遥测1.MQTTX 工具2.上传遥测 三、属性1.属性类型2.上传客户端属性3.下载共享属性4.订阅共享数据 四、设备告警1.配置告警规则2.清除报警规则3.测试3.1.设备告警3.1.清除告警 五、规则链1.规则管理2.Edge 查看规则链 Thi…

腾讯云对象存储的在Java使用步骤介绍

腾讯云对象存储的在Java使用步骤介绍 创建一个腾讯云的账户 这个自己去创建&#xff0c;然后开通对象存储服务&#xff0c;如下 有了账号就要创建一个对象存储的桶&#xff0c;也就是存储对象的一个容器 如果你想只有自己放存放的就设置 私有读写 &#xff0c;如果想用网络直…

SpringCloud Stream 消息驱动

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第九篇&#xff0c;即介绍 Stream 消息驱动。 二、消息驱动概念 2.1 消息驱动是什么 官方定义 Spring …

提升用户体验,Xinstall智能判定拉起技术来袭

在移动互联网时代&#xff0c;App推广已经成为各大企业的必争之地。然而&#xff0c;随着市场竞争的加剧&#xff0c;如何提升App的转化效率和用户体验成为了推广者们亟待解决的问题。这时&#xff0c;Xinstall的智能判定拉起技术应运而生&#xff0c;为推广者们带来了新的解决…

Go-知识select

Go-知识select 1. select 的特性1.1 chan读写1.2 返回值1.3 default 2. select 经典使用2.1 永久阻塞2.2 快速检错2.3 限时等待 3. 实现原理3.1 数据结构3.2 实现逻辑3.3 原理总结 4. 总结4.1 大概原理4.2 参数4.3 返回值 一个小活动&#xff1a; https://developer.aliyun.com…

element el-table 表格限制多选个数

本次的功能的要求是&#xff1a; 原本的引入的elment 的表格&#xff0c;去除全选框&#xff0c;版本对比的按钮&#xff0c;需要在选择版本&#xff0c;并且版本个数为2的时候&#xff0c;可点击&#xff0c;进行版本对比操作每次选择版本的时候&#xff0c;目前已有两个选择…

【C语言】—— 指针二 : 初识指针(下)

【C语言】——函数栈帧 一、 c o n s t const const 修饰指针1.1、 c o n s t const const 修饰变量1.2、 c o n s t const const 修饰指针 二、野指针2.1野指针的成因&#xff08;1&#xff09;指针未初始化&#xff08;2&#xff09;指针越界访问&#xff08;3&#xff09;指…

Hardness of Scheme-Switching and Comparison in FHE

参考文献&#xff1a; [AP13] Alperin-Sheriffff, J., Peikert, C.: Practical bootstrapping in quasilinear time. In: Canetti, R., Garay, J.A. (eds.) CRYPTO 2013. LNCS, vol. 8042, pp. 1–20. Springer, Heidelberg (2013). https://doi.org/10.1007/978-3-642-40041-…

微服务初识

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.1.单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打…

Qt4 设计师自定义控件----写好qmake文件,无需额外拷贝

前言 浏览了很多帖子&#xff0c;看了很多博主的教程&#xff0c;每一个都写的很好&#xff0c;美中不足的是。Qt在每次自定义插件时都需要拷贝&#xff0c;如果能够利用qmake install拷贝功能就很完美了&#xff0c;在其他人使用的时候只要简单的几个步骤就能轻松的用起来&am…

点餐平台网站|基于springboot框架+ Mysql+Java+Tomcat的点餐平台网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能实现 系统功能设计 数据库E-R图设计 lunwen参…

R语言数据挖掘-关联规则挖掘(1)

一、分析目的和数据集描述 要分析的数据是美国一区域的保险费支出的历史数据。保险费用数据表的每列分别为年龄、性别、体重指数、孩子数量、是否吸烟、所在区域、保险收费。 本文的主要目的是分析在年龄、性别、体重指数、孩子数量、是否吸烟、所在区域中这些因素中&#xf…

【PTA】L1-039 古风排版(C++)

题目链接&#xff1a;L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录&#xff1a; 目录&#xff1a; 题目要求&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 代码&#xff1a; 测试结…

【四 (4)数据可视化之 Ploty Express常用图表及代码实现 】

目录 文章导航一、介绍二、安装Plotly Express三、导入Plotly Express四、占比类图表1、饼图2、环形图3、堆叠条形图4、百分比堆叠条形图 五、比较排序类1、条形图2、漏斗图3、面积漏斗图 六、趋势类图表1、折线图2、多图例折线图3、分列折线图4、面积图5、多图例面积图 七、频…

解锁区块链游戏数据解决方案

作者&#xff1a;stellafootprint.network 随着区块链技术的日新月异&#xff0c;游戏行业正迎来一场革命&#xff0c;催生了区块链游戏的崛起。这一变革不仅为用户带来了全新的互动体验&#xff0c;也开辟了全新的盈利渠道。然而&#xff0c;在这一新兴领域&#xff0c;数据的…

程序人生——Java泛型和反射的使用建议

目录 引出泛型和反射建议93&#xff1a;Java的泛型是类型擦除的建议94&#xff1a;不能初始化泛型参数和数组建议95&#xff1a;强制声明泛型的实际类型 建议96&#xff1a;不同的场景使用不同的泛型通配符建议97&#xff1a;警惕泛型是不能协变和逆变的 建议98&#xff1a;建议…

安卓国产百度网盘与国外云盘软件onedrive对比

我更愿意使用国外软件公司的产品&#xff0c;而不是使用国内百度等制作的流氓软件。使用这些国产软件让我不放心&#xff0c;他们占用我的设备大量空间&#xff0c;在我的设备上推送运行各种无用的垃圾功能。瞒着我&#xff0c;做一些我不知道的事情。 百度网盘安装包大小&…

网络层_IP

传输层解决的是传输控制&#xff0c;而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输&#xff0c;而传输层是可靠性传输。所以传输层网络层就可以做到将数据可靠发送到对端。网络层的常见协议有&#xff1a;IP、ICMP等&#xff0c;其中最重要的是IP协议&#…

HTML、XHTML和HTML5系列对比

目录 HTML HTML的优点&#xff1a; HTML的缺点&#xff1a; 应用场景&#xff1a; XHTML XHTML的优点&#xff1a; XHTML的缺点&#xff1a; 应用场景&#xff1a; HTML5 HTML5的优点&#xff1a; HTML5的缺点&#xff1a; 应用场景&#xff1a; 回首发现&#xff0…