当前位置: 首页 > news >正文

设计模式:策略模式(C++实现)

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每个算法封装成独立的对象,使得它们可以互相替换。下面是一个使用C++实现策略模式的示例:

#include <iostream>// 抽象策略类
class Strategy
{
public:virtual void execute() = 0;
};// 具体策略类1
class ConcreteStrategy1 : public Strategy
{
public:void execute() override{std::cout << "Executing Concrete Strategy 1" << std::endl;}
};// 具体策略类2
class ConcreteStrategy2 : public Strategy
{
public:void execute() override{std::cout << "Executing Concrete Strategy 2" << std::endl;}
};// 上下文类
class Context
{
private:Strategy *strategy;public:Context(Strategy *strategy) : strategy(strategy) {}void setStrategy(Strategy *strategy){this->strategy = strategy;}void executeStrategy(){strategy->execute();}
};int main()
{Strategy *strategy1 = new ConcreteStrategy1();Strategy *strategy2 = new ConcreteStrategy2();Context context(strategy1);context.executeStrategy(); // 输出 "Executing Concrete Strategy 1"context.setStrategy(strategy2);context.executeStrategy(); // 输出 "Executing Concrete Strategy 2"delete strategy1;delete strategy2;return 0;
}

运行结果:

Executing Concrete Strategy 1
Executing Concrete Strategy 2

在上述示例中,我们首先定义了一个抽象策略类 Strategy,其中包含一个纯虚函数 execute()。然后,我们创建了两个具体策略类 ConcreteStrategy1 和 ConcreteStrategy2,它们分别实现了 execute() 函数。
接下来,我们定义了上下文类 Context,其中包含一个私有成员 strategy,用于保存当前的策略对象。Context 类中的 setStrategy() 函数用于设置当前策略,executeStrategy() 函数用于调用当前策略的 execute() 函数。
在 main() 函数中,我们首先创建了两个具体策略对象 strategy1 和 strategy2,然后创建了一个 Context 对象 context,并将 strategy1 设置为当前策略,最后调用 executeStrategy() 函数,输出的是 “Executing Concrete Strategy 1”。接着,我们将 strategy2 设置为当前策略,并再次调用 executeStrategy() 函数,输出的是 “Executing Concrete Strategy 2”。
这样,我们就实现了一个简单的策略模式。通过将算法封装成具体策略对象,并在上下文类中动态设置当前策略,我们可以根据需要切换不同的算法实现。这种方式使得算法的变化独立于使用算法的客户端,提高了代码的灵活性和可维护性。

相关文章:

设计模式:策略模式(C++实现)

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列的算法&#xff0c;并将每个算法封装成独立的对象&#xff0c;使得它们可以互相替换。下面是一个使用C实现策略模式的示例&#xff1a; #include <iostream>// 抽象策略类…...

网络安全深入学习第二课——热门框架漏洞(RCE—Thinkphp5.0.23 代码执行)

文章目录 一、什么是框架&#xff1f;二、导致框架漏洞原因二、使用步骤三、ThinkPHP介绍四、Thinkphp框架特征五、Thinkphp5.0.23 远程代码执行1、漏洞影响范围2、漏洞成因 六、POC数据包Windows下的Linux下的 七、漏洞手工复现1、先Burp抓包&#xff0c;把抓到的请求包发送到…...

Pdf文件签名检查

如何检查pdf的签名 首先这里有一个已经签名的pdf文件&#xff0c;通过pdf软件可以看到文件的数字签名。 图1为签名后的文件&#xff0c;图2为签名后文件被篡改。 下面就是如何代码检查这里pdf文件的签名 1.引入依赖 <dependency><groupId>org.projectlombok<…...

web前端之float布局与flex布局

float布局 <style>.nav {overflow: hidden;background-color: #6adfd0; /* 导航栏背景颜色 */}.nav a {float: left;display: block;text-align: center;padding: 14px 16px;text-decoration: none;color: #000000; /* 导航栏文字颜色 */}.nav a:hover {background-col…...

expected ‘,’ after expression in R【R错误】

出现如下错误&#xff1a; 在红色叉的位置&#xff0c;会有提示“expected . after expression”&#xff0c;咋一看出现红色叉的位置没有任何的错误&#xff0c;怎么会出现错误呢&#xff1f; 解决办法&#xff1a; 寻找这个代码第一次出现红色叉的位置&#xff0c;看其是否…...

算法|图论 2

LeetCode 695- 岛屿的最大面积 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述&#xff1a;给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求…...

使用C#实现服务端与客户端的简陋聊天

服务端代码: using System; using System.Net.Sockets; using System.Net; using System.IO;//服务器程序 namespace CSharpStudy_09_21 {class Program{static void Main(string[] args){int port 8865;TcpClient tcpClient;//创建tcp对象IPAddress[] serverIp Dns.GetHost…...

生成式模型和判别式模型区别

目录 1.概念 2.定义​ 3.举例​ &#xff08;1&#xff09;例子 A​ &#xff08;2&#xff09;例子 B​ 4.特点 5.优缺点 6.代表算法 1.概念 首先我们需要明确&#xff0c;两种不同的模型都用于监督学习任务中。监督学习的任务就是从数据中学习一个模型&#xff0c;并用…...

【kafka实战】03 SpringBoot使用kafka生产者和消费者示例

本节主要介绍用SpringBoot进行开发时&#xff0c;使用kafka进行生产和消费 一、引入依赖 <dependencies><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency><depen…...

Only file and data URLs are supported by the default ESM loader

1.版本问题 说明&#xff1a;将node版本提高就可以了。 2.nvm 说明&#xff1a;如果不想重复安装node版本&#xff0c;那么可以参考本人的nvm文档. nvm版本控制工具_FOREVER-Q的博客-CSDN博客...

LeetCode01

LeetCode01 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和 为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…...

计算机网络高频面试题集锦

问题1&#xff1a;谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 回答点&#xff1a;七层模型每层对应的作用及相关协议、为什么分层、为什么有TCP/IP四层模型 参考&#xff1a; 1、OSI七层参考模型是一个ISO组织所提出的一个标准参考分层模型&#xff0c;它按照数…...

Linux启动过程详解 Xmind导图笔记

参考大佬博客&#xff1a; 简要描述linux系统从开机到登陆界面的启动过程 Linux启动过程详解 Bootloader详解 来源&#xff1a;从BIOS开始画图了解Linux启动过程——老杨Linux...

Qt5开发及实例V2.0-第十七章-Qt版MyWord字处理软件

Qt5开发及实例V2.0-第十七章-Qt版MyWord字处理软件 第17章-Qt版MyWord字处理软件17.1 运行界面17.1.1 菜单设计基本操作17.1.2.MyWord系统菜单 17.2 工具栏设计17.2.1 与菜单对应的工具条17.2.2 附加功能的工具条 这段代码的作用是加载系统标准字号集&#xff0c;只要在主窗体构…...

机器视觉工程师们,常回家看看

我们在这个社会上扮演着多重角色&#xff0c;有时候我们很难平衡好这些角色之间的关系。 人们常言&#xff0c;积善成德&#xff0c;改变命运。善修者&#xff0c;懂得积累&#xff0c;懂得改变命运的重要性。 我曾年少不知父母之不易。一路依靠&#xff0c;一路成长。 所谓…...

网络隔离下实现的文件传输,现有的方式真的安全吗?

在当今的信息化时代&#xff0c;网络安全已经成为了各个企业和机构不可忽视的问题。为了保护内部数据和系统不受外部网络的攻击和泄露&#xff0c;一些涉及国家安全、商业机密、个人隐私等敏感信息的企业和机构&#xff0c;通常会对内外网进行隔离&#xff0c;即建立一个独立的…...

[医学图像知识]CT图和PET图的成像表现形式

1.CT图通常来说是单通道灰色图&#xff0c;用灰度值表示了结构对于x射线的吸收程度。 2.PET/SPECT图最初也是灰度图&#xff0c;用灰度值表示细胞的反射gama射线的程度&#xff0c;但是为了更好的观测不同细胞等的区别&#xff0c;通常将灰度图转化为了 伪彩色图像。 找个例子…...

聊聊wireshark的进阶使用功能 | 京东云技术团队

1. 前言 emmm&#xff0c;说起网络知识学习肯定离不来wireshark工具&#xff0c;这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器&#xff0c;平时更多的只是停留在初步的使用阶段。也是利用部门内部的网络兴趣小组…...

小米手机安装面具教程(Xiaomi手机获取root权限)

文章目录 1.Magisk中文网&#xff1a;2.某呼&#xff1a;3.最后一步打开cmd命令行输入的时候:4.Flash Boot 通包-Magisk&#xff08;Flash Boot通刷包&#xff09;5.小米Rom下载&#xff08;官方刷机包&#xff09;6.Magisk最新版本国内源下载 1.Magisk中文网&#xff1a; htt…...

DSU ON TREE

DSU ON TREE DSU&#xff1a;并查集 DSU ON TREE&#xff1a;树上启发式合并 我也不知道为啥树上并查集就是树上启发式合并 启发式合并的思想是每次把小的往大的合并&#xff0c;也就是最大化利用已有的答案&#xff08;大的数组不用清空&#xff0c;在原基础上加上小的即可&…...

SpringCloud Alibaba与Nacos版本不匹配?手把手教你解决‘Client not connected‘错误

SpringCloud Alibaba与Nacos版本兼容性实战&#xff1a;彻底解决Client not connected问题 微服务架构的复杂性往往隐藏在细节之中。当SpringCloud Alibaba项目启动时控制台突然抛出Client not connected, current status:STARTING的红色警告&#xff0c;不少开发者都会心头一紧…...

Vue3最新版二维码生成避坑指南:从基础配置到企业级定制(附GitHub源码)

Vue3企业级二维码生成实战&#xff1a;从核心原理到性能优化 二维码作为连接物理世界与数字世界的桥梁&#xff0c;在现代Web应用中扮演着重要角色。本文将带您深入Vue3的二维码生成技术栈&#xff0c;不仅涵盖基础实现&#xff0c;更聚焦企业级应用中的高阶技巧与性能优化方案…...

FigmaCN:5分钟快速实现Figma中文界面的终极解决方案

FigmaCN&#xff1a;5分钟快速实现Figma中文界面的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文界面而烦恼吗&#xff1f;figmaCN是一款专为中文用户打造…...

软件外包公司的“末路”:印度同行都慌了?——软件测试从业者的专业视角

在当今数字化浪潮中&#xff0c;软件外包行业曾是全球经济的重要引擎&#xff0c;尤其以印度为代表的外包巨头&#xff0c;凭借低成本人力优势主导了全球市场。然而&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;这一模式正面临前所未有的挑战…...

LFM2.5-1.2B-Thinking-GGUF效果展示:同一Prompt下Thinking中间态与终版回答对比图

LFM2.5-1.2B-Thinking-GGUF效果展示&#xff1a;同一Prompt下Thinking中间态与终版回答对比图 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;特别适合在资源有限的环境中快速部署和使用。该模型采用GGUF格式存储&#xff0c;通过ll…...

OpenClaw调试技巧:nanobot镜像的日志分析与问题定位

OpenClaw调试技巧&#xff1a;nanobot镜像的日志分析与问题定位 1. 为什么需要关注OpenClaw日志 上周我在本地部署nanobot镜像时遇到一个诡异现象&#xff1a;OpenClaw能正常接收飞书消息&#xff0c;但执行自动化任务时总在"思考阶段"卡住。这个问题困扰了我两天&…...

如何将Uvicorn部署到Azure Functions Premium Plan:完整指南

如何将Uvicorn部署到Azure Functions Premium Plan&#xff1a;完整指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn是Python生态中备受推崇的ASGI Web服务器&#xff…...

告别macOS原生切换烦恼:alt-tab-macos让窗口管理效率提升300%的终极指南

告别macOS原生切换烦恼&#xff1a;alt-tab-macos让窗口管理效率提升300%的终极指南 【免费下载链接】alt-tab-macos Windows alt-tab on macOS 项目地址: https://gitcode.com/gh_mirrors/al/alt-tab-macos 作为macOS用户&#xff0c;你是否也曾对系统自带的窗口切换功…...

OpenClaw+GLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题

OpenClawGLM-4.7-Flash学习助手&#xff1a;自动整理课程笔记与生成复习题 1. 为什么需要自动化学习助手&#xff1f; 去年备考研究生时&#xff0c;我每天要处理3-4小时的课程视频。最痛苦的不是听课本身&#xff0c;而是课后整理&#xff1a;手动截取关键片段、转录字幕、标…...

OpenClaw自动化测试:Qwen3.5-9B执行Python脚本与结果校验

OpenClaw自动化测试&#xff1a;Qwen3.5-9B执行Python脚本与结果校验 1. 为什么选择OpenClaw做自动化测试&#xff1f; 去年接手一个数据清洗工具链项目时&#xff0c;我遇到了一个典型痛点&#xff1a;每次代码更新后&#xff0c;都需要手动执行十几个测试用例&#xff0c;比…...