2023-7-8-第十四式策略模式

news2024/11/17 11:52:27


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之策略模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、策略模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式将不同的算法或行为封装在独立的类中,并使得它们可以互相替换,而客户端代码则不需要了解具体的实现细节。

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

  1. 环境(Context):环境类持有一个策略对象的引用,并在运行时调用策略对象的方法。环境类提供了一个接口,允许客户端在运行时动态地切换不同的策略。

  2. 抽象策略(Strategy):抽象策略定义了一个共同的接口,声明了一个或多个策略方法,每个方法对应了一个具体的算法或行为。所有具体策略类都要实现这个接口。

  3. 具体策略(Concrete Strategy):具体策略类实现了抽象策略中定义的方法,每个具体策略类提供了自己的算法或行为实现。

通过使用策略模式,可以实现算法的解耦和灵活性。客户端可以根据需求动态地选择和切换不同的策略,而无需修改大量的代码。

策略模式适用于以下情况:

  • 当有多个相关的类仅在算法或行为上有所不同时,可以使用策略模式来避免大量的条件语句。
  • 当需要在运行时动态地选择不同的算法或行为时,策略模式可以提供灵活性。
  • 当需要对算法进行扩展或修改时,可以通过添加新的具体策略类来实现,而无需修改已有代码。

总而言之,策略模式通过将算法封装在独立的类中,使得它们可以互相替换并与客户端解耦。这种设计模式提供了一种灵活的方式来处理多个相关类的算法差异,并支持运行时动态选择算法的能力。


🐱‍🐉二、策略模式实现

在C++中,可以使用策略模式通过接口和多态来实现。下面是一个简单的示例:

#include <iostream>

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

// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
    void execute() override {
        std::cout << "Executing strategy A" << std::endl;
        // 实现具体的算法或行为
    }
};

// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
    void execute() override {
        std::cout << "Executing strategy B" << std::endl;
        // 实现具体的算法或行为
    }
};

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

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

    void setStrategy(Strategy* strat) {
        strategy = strat;
    }

    void executeStrategy() {
        strategy->execute();
    }
};

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

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

    // 执行策略A
    context.executeStrategy();

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

    return 0;
}

在上述示例中,我们定义了抽象策略类 Strategy,并派生出两个具体策略类 ConcreteStrategyAConcreteStrategyB。这些具体策略类实现了抽象策略类中的纯虚函数,即各自的执行方法。

然后,我们定义了环境类 Context,它持有一个指向抽象策略类的指针,并提供了设置策略和执行策略的方法。

main() 函数中,我们创建具体策略对象,并通过将其传递给环境对象来设置初始策略。然后,我们调用环境对象的执行策略方法来执行当前设置的策略。

通过使用接口和多态,策略模式实现了算法的解耦和灵活性。我们可以根据需要动态地选择和切换不同的策略。


🎉三、模块之间的关系

策略模式涉及以下几个模块之间的关系:

  1. 环境类(Context):环境类是策略模式的核心,它持有一个策略对象的引用,并在运行时调用该策略对象的方法。环境类实现了客户端与具体策略类之间的解耦,客户端只需要与环境类进行交互即可。

  2. 抽象策略类(Strategy):抽象策略类定义了策略所需的接口或协议,它声明了一个或多个策略方法。这些方法代表不同的算法或行为,具体策略类必须实现这些方法。

  3. 具体策略类(Concrete Strategy):具体策略类是抽象策略类的派生类,它实现了抽象策略类中定义的策略方法。每个具体策略类提供了自己的算法或行为实现。在策略模式中,可以有多个具体策略类,代表不同的策略选项。

通过上述模块之间的关系,策略模式实现了一种动态选择算法的机制。客户端只需与环境类交互,并通过设置不同的策略对象来改变算法的行为。客户端不需要了解具体的策略实现细节,只需调用环境类提供的统一接口即可。

此外,策略模式还可以通过工厂类或依赖注入等方式来创建和管理具体策略对象。这样可以进一步降低客户端与具体策略类之间的耦合,并提供更大的灵活性和可扩展性。


🐱‍🚀四、注意事项

当使用策略模式时,有一些注意事项需要考虑:

  1. 接口设计:确保抽象策略类定义了清晰和一致的接口,以确保所有具体策略类都能正确实现这些方法。良好的接口设计有助于减少后续修改的风险。

  2. 策略数量:在设计时要合理考虑策略的数量。如果策略过多,可能会导致代码复杂性增加,并且选择合适的策略变得困难。可根据实际需求,避免过度设计。

  3. 策略切换开销:在运行时切换策略时,可能会引入一定的开销。因此,在选择是否使用策略模式时,应权衡灵活性和性能之间的权衡。

  4. 客户端责任:客户端负责选择合适的策略并将其传递给环境类。客户端需要理解不同策略之间的区别和适用场景,以确保选择最合适的策略。

  5. 策略共享状态:如果多个策略对象之间需要共享状态,需要谨慎处理。确保共享状态的一致性和线程安全性,或者考虑将状态存储在环境类中而不是策略对象中。

  6. 代码重用和维护:策略模式可以促进代码重用和维护。确保策略之间的差异明确,并遵循单一职责原则,以便更容易扩展和修改具体策略。

  7. 需求变化:当需求发生变化时,可能需要添加新的策略或修改现有的策略。在设计时要考虑到这种变化,并尽量使系统具有弹性,以方便适应未来的需求变更。

总之,使用策略模式需要仔细考虑接口设计、策略数量、切换开销和共享状态等因素。理解策略模式的优缺点并根据实际情况进行合理的设计和使用,可帮助提高代码的灵活性、可维护性和可扩展性。


🎂五、使用场景

策略模式适用于以下场景:

  1. 算法或行为的差异化:当有多个相关的类仅在算法或行为上有所不同时,可以使用策略模式来避免大量的条件语句。例如,不同的支付方式(信用卡、支付宝、微信支付)具有不同的支付算法。

  2. 运行时动态选择算法:当需要在运行时动态地选择不同的算法或行为时,策略模式可以提供灵活性。例如,根据用户的偏好设置,在游戏中选择不同的难度级别。

  3. 算法的扩展和修改:如果希望能够方便地对算法进行扩展或修改,可以通过添加新的具体策略类来实现,而无需修改已有代码。这样可以降低代码的耦合性,并且符合开闭原则。

  4. 客户端与算法的解耦:策略模式将具体的算法封装在独立的策略类中,使得客户端与具体算法的实现细节解耦。客户端只需使用抽象策略类和环境类进行交互,而无需了解具体算法的实现细节。

  5. 多态替代条件语句:使用策略模式可以避免使用大量的条件语句,提高代码的可读性和可维护性。通过多态特性,可以将不同的算法封装在具体策略类中,以更简洁、清晰的方式实现业务逻辑。

总而言之,策略模式适用于需要根据不同情况选择不同算法或行为的场景,并且可以灵活地扩展和修改算法。它帮助降低代码的耦合性,提高代码的可读性和可维护性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于策略模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

axios拦截器

在请求或响应被 then 或 catch 处理前拦截它们。 // 添加请求拦截器 axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});// 添加响应拦截器 axios.inte…

PMSG永磁风机VSG网侧虚拟同步控制一次调频四机两区域系统,离散模型。

PMSGM永磁同步风机VSG虚拟同步机调频两区域系统&#xff0c;离散模型&#xff0c;非无穷大电网。 风机为网侧VSG控制。四机两区域系统&#xff0c;渗透率可调。当前渗透率为区域1&#xff0c;一台900MW同步机&#xff0c;区域2一台900MW同步机&#xff0c;永磁同步风电场容量5…

minio 升级相关问题

系列文章目录 文章目录 系列文章目录前言一、集群部署二、单机部署三、写一个启动脚本四、性能方面 前言 minio版本升级&#xff0c;目的主要是为了解决由 Direct buffer memory 引发的附件下载优化方案 minio version RELEASE.2021-01-16T02-19-44Z > minio version RELEA…

60题学会动态规划系列:动态规划算法第四讲

买卖股票相关的动态规划题目 文章目录 1.买卖股票的最佳时机含冷冻期2.买卖股票的最佳时期含⼿续费3.买卖股票的最佳时机III4.买卖股票的最佳时机IV 1.最佳买卖股票时机含冷冻期 力扣链接&#xff1a;力扣 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的…

Delphi XE编写OCX控件

1、new->other 2、Active libary 3、再次New->Other,才出现ActiveX组件内容 设置类名及参数

在 Vue 3 中使用阿里巴巴矢量图标库

在项目中基本会用到图标&#xff0c;比较常见的就是阿里图标库。这篇文章主要介绍如何在vue3中使用图标库。 下载并全局注册自定义图标库 手动下载阿里巴巴矢量图标库的字体文件&#xff1a; 在阿里巴巴矢量图标库网站上选择您需要的图标&#xff0c;并将其添加到购物车。然后…

CMake之CPack

文章目录 一、CPack1.用CPack打包成为deb包2.如何确定的Depends依赖包?3.如何确定编译Build-Depends&#xff1f;4.Cpakc打包RPM包 二、deb的简单使用三、deb包相关文件说明1.control文件2.preinst文件3.postinst文件4.prerm文件5.postrm文件 一、CPack CPack 是 CMake 2.4.2…

SpringBoot 集成 EasyExcel 3.x 实现 Excel 导出

目录 EasyExcel官方文档 EasyExcel是什么&#xff1f; EasyExcel注解 springboot集成EasyExcel 简单入门导出 &#xff1a; 实体类 自定义转换类 测试一下 复杂表头一对多导出 &#xff1a; 自定义注解 定义实体类 自定义单元格合并策略 测试一下 EasyExcel官方文档 …

The Sandbox 展示泰国 2023 年元宇宙生态系统

The Sandbox 举办了 2023 年泰国合作伙伴日活动&#xff0c;宣布创建泰国元宇宙生态系统&#xff0c;并对泰国创客社区的巨大合作和发展表示认可。 The Sandbox 联合创始人兼首席运营官 Sebastien BORGET 说&#xff1a;“我们很高兴见证 The Sandbox 泰国生态系统的发展&#…

第七章 网络安全【计算机网络】

第七章 网络安全【计算机网络】 前言推荐第7章 网络安全7.1网络安全问题概述7.1.1计算机网络面临的安全性威胁7.1.2安全的计算机网络7.1.3数据加密模型 7.2两类密码体制7.2.1对称密钥密码体制7.2.2公钥密码体制 7.3鉴别7.3.1报文鉴别7.3.2实体鉴别 7.4密钥分配7.4.1 对称密钥的…

银行软开能干到退休吗?

大家好&#xff0c;我是熊哥。 21世纪了好像不躺平对不起自己&#xff1f;很多读者都关心哪些企业适合躺平&#xff0c;做程序员是不是在银行可以舒舒服服干一辈子&#xff1f;银行招软开&#xff08;软件开发&#xff09;有哪些要求&#xff1f; 现在就来详细讲一讲。 擦亮…

数据结构--二叉树的线索化

数据结构–二叉树的线索化 用土办法找到中序前驱 typedef struct BiTNode {ElemType data; //数据域struct BiTNode *lchild, *rchild; //左、右孩子指针struct BiTnode *parent; //父节点指针 }BiTNode, *BiTree;BiTNode *p; // p指向目标结点 BiTNode *pre NULL; //指向当前…

用Postman和jmeter做接口测试有什么区别吗?

目录 1.创建接口用例集&#xff08;没区别&#xff09; 2.步骤的实现&#xff08;有区别&#xff09; 3数据用例的实现 4断言的实现 5执行 6其他 总结&#xff1a; 1.创建接口用例集&#xff08;没区别&#xff09; Postman是Collections&#xff0c;Jmeter是线程组&am…

web安全php基础_php之string对象详解

PHP 字符串 字符串变量用于包含有字符的值。 在创建字符串之后&#xff0c;我们就可以对它进行操作了。您可以直接在函数中使用字符串&#xff0c;或者把它存储在变量中。 在下面的实例中&#xff0c;我们创建一个名为 txt 的字符串变量&#xff0c;并赋值为 “Hello world!…

MySQL数据库:数据库管理系统与安装MySQL数据库

目录 一、理论 1.数据库管理系统 2.关系型数据库 3.数据库 4.MySQL数据库 5.MySQL部署 二、实验 1.yum安装MySQL 2.配置MySQL数据库的Tab补全 三、问题 1.数据库登录报错 2.数据库密码复杂度报错 四、总结 一、理论 1.数据库管理系统 &#xff08;1&#xff09…

深入浅出fromCharCode和charCodeAt

先来看一个简单的输入输出 console.log(String.fromCharCode(30328)); //癸console.log(癸.charCodeAt()) //30328来回答一个问题&#xff0c;30328是什么&#xff1f; ascii? unicode? utf-8? utf-16? 来让我们看看fromCharCode 在MDN上面的解释 UTF-16代码单元序列…

【数据分析 - 基础入门之NumPy③】日常难题解决

知识目录 前言一、启动Jupyter Notebook报错没有这样的目录结语# 往期文章&相关导读 前言 本篇文章用于整理在学习 NumPy 过程中遇到的错误&#xff0c;以此做个记录&#xff0c;希望能帮助到大家&#xff0c;让大家少走弯路。 一、启动Jupyter Notebook报错没有这样的目…

改动最小,最简洁的 tomcat catalina.out日志切割(按天)

tomcat日志切割 环境:实现步骤具体操作 环境: 系统: linux操作系统 centOStomcat 8.5* 实现步骤 安装cronolog工具修改tomcat中的bin目录下的 catalina.sh 文件配置重启tomcat 具体操作 安装cronolog 工具输入命令: yum install cronolog 中间 停顿 填个 y 同意修改配置…

什么是cookies,session,token(面试必问)

目录 前言 http无状态 cookies cookie的格式显示 cookie存在问题 利用cookies可以做什么 session session的格式显示 session存在的问题 利用session可以做什么 token token的格式显示 token存在的问题 利用token可以做什么 总结 前言 一般在面试的时候&#xf…

内网隧道代理技术(九)之应用层代理技术介绍

应用层代理技术介绍 前面我们介绍了相关的一些概念和隧道的技术,主要还是停留在单个端口的隧道 1、反弹shell2、端口转发3、端口映射这些都是利用端口建立隧道,但是并不能满足我们日常生活中的要求 加入我们需要对网络中的机器进行扫描,我们就不能使用端口转发或者端口映射…