C++设计模式---策略模式

1、介绍

        策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的内部算法。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

        在C++中实现策略模式,通常会有一个策略接口(或抽象类),以及多个实现该接口的类(即策略);然后有一个上下文(Context)类,它使用策略接口,并在运行时注入(或设置)所需的策略

在C++中实现策略模式,由下面几部分组成:

        (1)抽象策略角色(strategy):抽象策略类。

        (2)具体策略角色(concrete strategy):封装了相关的算法和行为。

        (3)环境角色(context):持有一个策略类的引用,最终给客户端调用。

2、示例

实现0、1、2三种模式,打印三种模式下的内容。

头文件:

# ifndef _STRATEGY_H_
# define _STRATEGY_H_// 使用枚举声明策略的种类
typedef enum Strategy_type {Strategy_type_0 = 0,Strategy_type_1,Strategy_type_2
}TYPE_MODE;// 策略接口类【抽象类】
class Strategy {
public:virtual void Strategy_print() = 0;
};// 具体的策略类
class Strategy_0:public Strategy {
public:void Strategy_print() {std::cout << "this is 000000" << std::endl;}
};class Strategy_1:public Strategy {
public:void Strategy_print() {std::cout << "this is 111111" << std::endl;}
};class Strategy_2 :public Strategy {
public:void Strategy_print() {std::cout << "this is 222222" << std::endl;}
};class Context {
public:Strategy* sssttt;Context(TYPE_MODE mode) {switch (mode) {case Strategy_type_0:sssttt = new Strategy_0();break;case Strategy_type_1:sssttt = new Strategy_1();break;case Strategy_type_2:sssttt = new Strategy_2();break;default:sssttt = nullptr;}}~Context() {if (nullptr != sssttt) {delete sssttt;sssttt = nullptr;}}
};# endif

cpp文件:

#include <iostream>
#include "celue-moshi.h"int main(int argc, char** argv) {Context* context_0 = new Context(Strategy_type_0);Context* context_1 = new Context(Strategy_type_1);Context* context_2 = new Context(Strategy_type_2);context_0->sssttt->Strategy_print();context_1->sssttt->Strategy_print();context_2->sssttt->Strategy_print();if (nullptr != context_0) {delete context_0;context_0 = nullptr;}if (nullptr != context_1) {delete context_1;context_1 = nullptr;}if (nullptr != context_2) {delete context_2;context_2 = nullptr;}return 0;
}

结果:

this is 000000
this is 111111
this is 222222

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

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

相关文章

USB转I2C转SPI芯片CH341

CH340与CH341区别 CH340主要用于将USB转换为各种串口&#xff0c;CH340H和CH340S可以实现USB转并口。 CH341和340的不同之处在于CH341提供I2C和SPI接口&#xff0c;方便连接到I2C或SPI总线操作相关的器件。 CH341主要有6种封装。见表1. CH341T SSOP-20封装和丝印 USB 总线转接…

【服务实现读写分离】

文章目录 什么是读写分离基于Spring实现实现读写分离项目中常用的数据源切换依赖包 什么是读写分离 服务读写分离&#xff08;Service Read-Write Splitting&#xff09;是一种常见的数据库架构设计模式&#xff0c;旨在提高系统的性能和可扩展性。通过将读操作和写操作分离到…

分布式事务AP控制方案(上)

分布式事务控制方案 本篇文章给出一种要求高可用性&#xff08;AP思想&#xff09;的分布式事务控制方案 下篇新鲜出炉&#xff1a;点我查看 分布式事务控制方案1、业务背景2、本地消息表的设计3、对消息表的操作4、任务调度5、任务流程控制的抽象类6、课程发布的实现类7、总…

[力扣题解] 236. 二叉树的最近公共祖先

题目&#xff1a;236. 二叉树的最近公共祖先 思路 代码 用深度搜索的思想&#xff08;好吧&#xff0c;前序、中序、后序都是深搜思想&#xff09;&#xff0c;保存寻找路径&#xff0c;看看找到2个节点的路径的重合部分&#xff0c;就可以找到最近公共祖先&#xff1b; /*…

代理IP使用api接

代理IP使用API接口&#xff0c;通常是指通过API接口获取代理IP地址&#xff0c;并将其应用于爬虫、数据采集、反爬虫等场景中&#xff0c;以提高数据采集效率和保护数据采集安全。 一般来说&#xff0c;代理IP提供商会提供API接口文档和SDK供开发者使用。你需要先注册并登录代…

硬件工程师的蜗牛成长路

一名合格的硬件工程师&#xff0c;需要掌握的知识有很多&#xff0c;知识点积累不是一蹴而就&#xff0c;而是细水长流&#xff0c;螺旋提升&#xff0c;不急&#xff0c;慢慢来&#xff0c;想掌握的都能掌握&#xff0c;就让时间来见证个人的成长路径。 ---大青山 2024/6/10 …

diffusers 再次继续训练LoRA时,如何导入已有的LoRA权重

我们通常会有微调扩散模型的需求&#xff0c;比如对LoRA进行训练来实现对Stable diffusion模型的微调。 但是有时候我们需要复用先前训练好的LoRA参数来继续进行训练。此时并不需要我们重新使用API向U-Net网络加载LoRA对应的adapter参数权重&#xff0c;我们可以直接通过diffu…

优质免费的 5 款翻译 API 接口推荐

当谈到翻译API时&#xff0c;我们通常指的是一种编程接口&#xff0c;它允许开发者将文本从一种语言翻译成另一种语言。这些API通常由专业的翻译服务提供商提供&#xff0c;如谷歌翻译 API、实时翻译API、腾讯翻译API、DeepL翻译API、Azure翻译API等。 这些API通常提供多种语言…

MFC 教程-文本框失去焦点处理

MFC 教程-文本框失去焦点处理 一、MFC 文本框控件概述 1.1 定义与应用场景 在 MFC(Microsoft Foundation Class)中,文本框控件(CEdit)是一个常用的用户界面元素,用于接收用户输入的文本信息。它广泛应用于各种窗口应用程序中,从简单的登录界面到复杂的数据输入表单。 …

基于springboot的欢迪迈手机商城源码数据库

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本欢迪迈手机商城就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#xf…

使用Redis的优势以及会引发的问题

优势 ①使用redis代表着高性能还有高并发&#xff0c;高性能很好理解&#xff0c;redis会缓存我们访问的数据。他是基于内存的&#xff0c;第一次访问数据库我们可能需要800ms&#xff0c;但是访问后如果使用redis进行缓存&#xff0c;第二次乃至后面访问相同的数据就只需要去…

使用opencv在图像上画带刻度线的对角线,以图像中心点为0点

使用OpenCV在图像上绘制带刻度线的对角线&#xff0c;可以通过以下步骤实现。我们将首先找到图像的中心点&#xff0c;然后绘制对角线线&#xff0c;并在这些线的适当位置绘制刻度线。以下是详细的C代码示例&#xff1a; void Draw_diagonal(cv::Mat& mat, double dFactor…

ViT:2 理解CLIP

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

js中如何清除一个对象中指定的键名

在 JavaScript 中&#xff0c;你可以使用 delete 关键字来删除对象中的指定键名。以下是一个简单的示例代码&#xff0c;演示如何清除一个对象中指定的键名&#xff1a; // 创建一个包含键值对的对象 let person {name: Alice,age: 30,city: New York };console.log(Before d…

2.linux下的文件系统结构、磁盘管理以及常规操作

一、文件系统结构 1.1根目录 Linux下“/”就是根目录&#xff0c;所有的目录都是由根目录衍生出来的。 1.2Ubuntu文件系统结构 文件作用/bin存放二进制可执行文件&#xff0c;这些命令在单用户模式下也能够被使用。可以被root和一般账户使用/bootUbuntu内核和启动文件&#…

【SpringBoot】在Spring中使用自定义条件类在Java声明Bean时实现条件注入

在Spring框架中&#xff0c;通过实现org.springframework.context.annotation.Condition接口并重写matches()方法&#xff0c;可以根据自定义条件来控制Bean的注入。这种机制非常灵活&#xff0c;可以帮助开发人员根据环境或配置来有选择地启用或禁用某些Bean。本文将详细介绍如…

express+vue实现一个在线im

在线体验地址 需要用邮箱注册一个账号 在线链接 目前实现的功能 1、在线聊天(群聊) 2、实时监控成员状态 3、历史聊天&#xff0c;下拉加载 4、有新消息&#xff0c;自动滚动到最新消息&#xff0c;如果自己在查看历史记录&#xff0c;不会强行滚动 exprees部分 创建几个表…

《永生之后》读后

文章以2120年背景创作&#xff0c;人类进入永生之年&#xff0c;发现了延长寿命的药物。停滞的死亡&#xff0c;新生的继续造生了人口大爆炸&#xff0c;于是分成两个阵营-长生区&#xff08;不再繁衍后代&#xff09;与生死区&#xff08;不服用药物&#xff0c;仍然生老病死&…

单片机中的四种通信总线:UART、I2C、SPI、CAN

1. UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09; 特点&#xff1a; 通信方式&#xff1a;异步串行通信连接线数&#xff1a;两条&#xff08;TX传输线&#xff0c;RX接收线&#xff09;时钟信号&#xff1a;不需要&#xff0c;双方通过预设波特…

PySpark教程(001):基础准备与数据输入

PySpark 学习目标 了解什么是Spark、PySpark了解为什么学习PySpark了解如何和大数据开发方向进行衔接 Spark是什么&#xff1f; Apache Spark是用于大规模数据处理的统一分析引擎。 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器…