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

文章目录

  • 前言
  • 一、策略模式是什么?
  • 二、策略模式的实现原理
  • 三、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;// 创建环境对象,并设置初始策略为 AContext 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.mzph.cn/news/746863.shtml

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

相关文章

Android 14.0 SystemUI设置系统导航栏默认为系统手势导航

1.概述 在14.0的原生系统rom产品定制化开发中,系统导航栏在10.0以后可以支持手势导航,但系统导航栏默认的是三键导航,Home Back Recent键三个键显示在底部 但是对于一些全屏的app 感觉操作起来不太方便,所以产品需要要求使用导航栏设置为系统手势导航这时系统底部就不会被…

Bugku MISC做题笔记

简单套娃DX 这一题需要对png图片的结构有所了解。详细可参考https://www.w3.org/TR/png/ 幸好每一张图片只有一个错误&#xff0c;逐步调试&#xff0c;就可以发现所有错误&#xff0c;修正即可。具体错误参看python程序中的注释&#xff1a; import ossrc_dir .\\XD\\ de…

Sklearn Lasso回归

以下是一个使用Sklearn库实现Lasso回归的简单代码示例。Lasso回归是一种用于回归分析的线性模型&#xff0c;它通过正则化项来强加稀疏性&#xff0c;从而可以估计系数的非零值&#xff0c;并使得某些系数变为零。 # 导入必要的库 from sklearn.linear_model import Lasso fro…

nicetool--替代hutool和fastjson的工具库

前言 如果你被hutool坑过、被fastjson坑过&#xff0c;nicetool帮你解脱&#xff01; 如果你想用稳定、Spring原生的工具类&#xff0c;nicetool已帮你封装&#xff01; nicetool不生产工具&#xff0c;只是JDK和Spring的封装侠&#xff01; 介绍 nicetool&#xff1a;超好…

微信每天通过好友上限是多少个呢?

微信每天通过好友上限是多少个呢&#xff1f; 1、新号和不活跃的号 微信新号是指注册不满15十五天&#xff0c;或者注册超过15天&#xff0c;但是没有好好养号的的账号。&#xff08;包括很多长期不活跃的账号&#xff0c;突然使用的情况&#xff09; 2、正常帐号 &#xf…

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Scala--01--简介、环境搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么&#xff1f;官网&#xff1a; [https://scala-lang.org/](https://scala-lang.org/)官方文档&#xff1a; [https://docs.scala-lang.…

在Flutter中创建自定义的左对齐TabBar组件

在Flutter应用程序中&#xff0c;TabBar是一种常见的UI模式&#xff0c;用于在不同的标签页之间进行导航。然而&#xff0c;默认情况下&#xff0c;Flutter的TabBar在水平方向上是居中对齐的。本文将介绍如何创建一个自定义的左对齐TabBar组件&#xff0c;以满足特定的布局需求…

三、贪心算法

三、贪心算法 文章目录 三、贪心算法1、找零钱2、求一个数列的极差3、将真分数用埃及分数之和表示4、找到出现最多次数的数5、将给定的整数去掉任意个数字后重新组成最小整数 1、找零钱 #include <stdio.h> int a[7]{100,50,20,10,5,2,1},ns[7]; void main() {/********…

基于springboot+vue实现的大学计算机课程管理平台的设计与实现(全套资料)

一、系统架构 前端&#xff1a;vue | antv 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk17 | mysql | maven | node | redis 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 系统基础模块-用户管理 04. 系统基础模块-部门…

一个人做电商要怎么做?满足这三个条件,你也可以!

我是电商珠珠 现在电商平台很火&#xff0c;特别是短视频电商&#xff0c;很多从来没有接触过的新手会觉得自己一个人做不了&#xff0c;或者说投入成本大&#xff0c;会有很多人工费用&#xff0c;还要找货源找场地等。 其实&#xff0c;对于传统的电商来说&#xff0c;这些…

记一次Spring事务失效的发现与解决过程

一、事情起因是这样的 首先&#xff0c;我们是使用Spring mybatis 进行开发。 某功能在测试环境看到报错日志&#xff0c; 但是数据库里面的数据发生了变化&#xff0c;没有回滚。 执行数据库update 操作的方法上明确有 Transactional(rollbackFor Exception.class)的注解。…

蓝桥杯单片机快速开发笔记——HC573/HC138

一、原理分析 二、思维导图 三、代码参考 #include "HC573.h" #include "reg52.h"void Set_HC573(unsigned char channel, unsigned char dat) {P2 (P2 & 0x1f) | 0x00; //赋值之前&#xff0c;关闭全部锁存器P0 dat; //保存待设置…

Webshell溯源排査与反制

工具查杀 使用d盾、安全狗、护卫神等webshell查杀工具查杀web目录 d盾&#xff1a;D盾防火墙 网站安全狗&#xff1a;网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改 百度webshell查杀引擎&#xff1a;https://scanner.baidu.com/#/pages/intro 手工…

阿里云和腾讯云2核4G服务器租用价格对比,选哪个好?

租用2核4G服务器费用多少&#xff1f;2核4G云服务器多少钱一年&#xff1f;1个月费用多少&#xff1f;阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年&#xff1b;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

长期护理保险可改善老年人心理健康 | CHARLS CLHLS CFPS 公共数据库周报(3.6)...

欢迎报名2024年“真实世界临床研究”课程&#xff01; 本周郑老师开讲&#xff1a;“真实世界临床研究”培训班&#xff0c;3月16-17日两天&#xff0c;欢迎报名&#xff01; CHARLS公共数据库‍ CHARLS数据库简介中国健康与养老追踪调查(China Health and Retirement Longitud…

多模态特征融合新突破!5大方法刷新顶会SOTA!

多模态融合可以应用于情感分析、身份验证、行为识别等多个领域&#xff0c;实现更精确的预测和判断。这其中&#xff0c;特征融合是多模态数据处理的核心环节&#xff0c;它不仅能够提高模型的性能&#xff0c;还能够增强数据的表达力&#xff0c;让模型能够更好地理解和处理现…

案例分析篇05:数据库设计相关28个考点(9~16)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

白嫖AWS云服务器,验证、注册指南

背景 不知道你想不想拥有一台属于自己的云服务器呢&#xff0c;拥有一台自己的云服务器可以建站&#xff0c;可以在上面搭建个人博客&#xff0c;今天我就来教大家如何申请亚马逊 AWS 免费云服务器&#xff0c;这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继…

测试人员业务提升的几个方面

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 整个文章来源于我的xmind梳理和总结&#xff0c;接下来为各位一步步拆解。 一、测试流程遵守和推进 在…