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

策略模式的C++实现示例

核心思想

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改其代码。策略模式的核心是将算法与使用算法的客户端解耦,使得算法可以独立于客户端变化。

**Context:**持有一个策略对象的引用,负责调用策略的具体实现。
**Strategy:**定义所有支持的算法的公共接口。
**ConcreteStrategy:**实现Strategy接口,提供具体的算法实现。

使用场景

多种算法切换:如排序算法(快速排序、冒泡排序等)或支付方式(信用卡、支付宝等)。
避免条件语句:当代码中有大量条件分支用于选择不同行为时,可以用策略模式替代。
算法复用:当多个类需要共享相同的行为,但行为的具体实现不同时。
动态切换行为:如游戏中的角色在不同状态下使用不同的攻击策略。
测试与调试:策略模式可以方便地替换算法的实现,便于测试和调试。

解决的问题

代码重复问题:
如果多个类使用相同的算法,但算法的实现分散在各处,会导致代码重复。策略模式将算法集中管理,避免重复。

紧耦合问题:
在传统设计中,算法直接嵌入在客户端代码中,导致客户端与算法紧耦合。策略模式通过将算法抽象为接口,解耦了客户端和具体算法。

扩展性问题:
新增算法时,需要修改客户端代码。策略模式允许动态添加新算法,而无需修改现有代码。

条件分支问题:
当代码中有大量条件分支用于选择不同行为时,策略模式可以将其替换为对象的多态调用,使代码更清晰。

优点

**开闭原则:**新增算法无需修改现有代码,只需添加新的策略类。
**解耦:**将算法的实现与使用分离,提高代码的灵活性和可维护性。
**复用性:**策略类可以在不同上下文中复用。
**简化测试:**每个策略类可以独立测试。

缺点

**类数量增加:**每个算法都需要一个单独的类,可能导致类的数量增多。
**客户端需要了解策略:**客户端需要知道有哪些策略,并选择合适的策略。
**性能开销:**策略模式可能引入额外的对象创建和调用开销。

示例代码

如下代码中,Context类(即客户端)是稳定、可以不变的,变化的是策略,而策略是根据运行时的实际情况来选择的。通过继承Strategy类并重写execute()接口实现策略的扩展。

#include <iostream>
#include <memory>// 抽象策略接口
class Strategy {
public:virtual void execute() const = 0;virtual ~Strategy() = default;  // 虚析构函数,确保正确释放资源
};// 具体策略A
class ConcreteStrategyA : public Strategy {
public:void execute() const override {std::cout << "执行策略A" << std::endl;}
};// 具体策略B
class ConcreteStrategyB : public Strategy {
public:void execute() const override {std::cout << "执行策略B" << std::endl;}
};// 上下文类,持有策略对象并调用其方法
class Context {
private:std::unique_ptr<Strategy> strategy;  // 使用智能指针管理策略对象public:// 构造函数,允许传入策略对象Context(std::unique_ptr<Strategy> s) : strategy(std::move(s)) {}// 设置策略void setStrategy(std::unique_ptr<Strategy> s) {strategy = std::move(s);}// 执行策略void executeStrategy() const {if (strategy) {strategy->execute();} else {std::cout << "未设置策略" << std::endl;}}
};int main() {// 创建上下文对象,并初始化为策略AContext context(std::make_unique<ConcreteStrategyA>());context.executeStrategy();  // 输出: 执行策略A// 动态切换到策略Bcontext.setStrategy(std::make_unique<ConcreteStrategyB>());context.executeStrategy();  // 输出: 执行策略Breturn 0;
}

代码说明

​Strategy:抽象策略接口,定义了所有具体策略类必须实现的方法execute()。
​ConcreteStrategyA​ 和 ​ConcreteStrategyB:具体策略类,分别实现了不同的算法或行为。
​Context:上下文类,持有一个策略对象的引用,并提供了设置策略和执行策略的方法。
​智能指针:使用std::unique_ptr管理策略对象的生命周期,避免内存泄漏。

运行结果

执行策略A
执行策略B

总结

通过策略模式,我们可以将算法的实现与使用算法的环境解耦,使得算法可以独立于客户端代码进行扩展和修改。这种设计模式特别适用于需要动态切换算法的场景。

相关文章:

策略模式的C++实现示例

核心思想 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端&#xff0c;从而使得客户端可以根据需要动态切换算法&#xff0c;而不需要修改…...

keil软件下载安装使用(STM32篇)

一、前言 Keil软件是一款专为嵌入式系统开发设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由德国Keil公司创立&#xff0c;后被ARM公司收购并持续更新维护。它集成了代码编辑、编译、调试和项目管理等功能&#xff0c;广泛应用于各类单片机的程序开发&#xff0…...

【简单的C++围棋游戏开发示例】

C围棋游戏开发简单示例&#xff08;控制台版&#xff09; ‌核心代码实现‌ #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9‌:ml-citation{ref"1" data"citationList&…...

【Python 数据结构 4.单向链表】

目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 ​编辑 三…...

组合逻辑和时序逻辑

组合逻辑 定义 组合逻辑电路是一种输出只取决于当前输入值的电路&#xff0c;即电路的输出状态仅由当前时刻的输入信号组合决定&#xff0c;与电路过去的状态无关。 特点 无记忆功能&#xff1a;组合逻辑电路不具备存储信息的能力&#xff0c;它不会记住之前的输入情况。每次…...

如何有效判断与排查Java GC问题

目录 一、GC的重要性与对性能的影响 &#xff08;一&#xff09;GC对性能的影响简要分析 1.GC暂停与应用停顿 2.GC吞吐量与资源利用率 3.GC对内存管理的作用&#xff1a;资源回收 4.GC策略与优化的选择 &#xff08;二&#xff09;GC的双刃剑 二、GC性能评价标准 &…...

Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit

步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…...

【流行病学】Melodi-Presto因果关联工具

title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...

Android14 OTA差分包升级报Package is for source build

制作好差分包&#xff0c;使用adb线刷模式验证ota升级&#xff0c;出现E:Package is for source build错误 使用adb方式验证 进入recovery模式 adb reboot recovery稍等一会界面会提示 Now send the package you want to apply to the device with "adb sidelaod <…...

PTA L2一些题目

L2-014 列车调度 - 团体程序设计天梯赛-练习集 样例是怎么来的呢&#xff1f;通过题目我们知道每一条轨道的车牌号必须是依次递减的。那么&#xff0c;我们如果让每条轨道尽可能长就能保证轨道数最少------也就是说&#xff0c;我们要尽可能的找最长降序序列。 但是1e5数据量…...

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标&#xff1a;将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…...

基于STM32的智能家居蓝牙系统(论文+源码)

1总体方案设计 本次基于STM32的智能家居蓝牙系统&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DHT11传感器实现温湿度检测&#xff0c;MQ-2烟雾传感器实现烟雾检测&#xff0c;光敏电阻实现光照检测&#xff0c;同时将数据…...

视觉Transformer(DETR)

文章目录 DETR总体流程DETR 中 transformer 结构encoderdecoderObeject Query HEADFFNLOSS正负样本分配 简单的demo不足之处 DETR 是首次将 Transformer结构首次应用到视觉 目标检测中&#xff0c;实现 端到端的目标检测。 传统目标检测路线&#xff08;yolo代表&#xff09…...

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是MySQL篇中&#xff0c;非常实用性的篇章&#xff0c;相信在实际工作中对于表的查询&#xff0c;很多时候会涉及多表的查询&#xff0c;在多表查询…...

【Office-Word】如何自动生成中英文目录

1.目录介绍 Word这个自动生成目录非常强大&#xff0c;涉及的功能很琐碎&#xff0c;想要完美的生成目录不仅仅是只会目录这么简单&#xff0c;前后涉及到的大纲级别、目标样式和域代码等操作是比较头疼的。 下面就一步一步开始介绍 2.多级标题级别编号设置 目录想要设置好…...

低代码平台的后端架构设计与核心技术解析

引言&#xff1a;低代码如何颠覆传统后端开发&#xff1f; 在传统开发模式下&#xff0c;一个简单用户管理系统的后端开发需要&#xff1a; 3天数据库设计5天REST API开发2天权限模块对接50个易出错的代码文件 而现代低代码平台通过可视化建模自动化生成&#xff0c;可将开发…...

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…...

【leetcode hot 100 73】矩阵置零

解法一&#xff1a;&#xff08;使用两个标记变量&#xff09;用矩阵的第一行和第一列代替方法一中的两个标记数组&#xff08;col、row[ ]&#xff1a;第几列、行出现0&#xff09;&#xff0c;以达到 O(1) 的额外空间。 这样会导致原数组的第一行和第一列被修改&#xff0c;…...

【Linux】自定协议和序列化与反序列化

目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 &#xff08;一&#xff09;TCP如何保证接收方的接收到数据是完整性呢&#xff1f; &#xff08;二&#xff09;自定义协议 &#xff08;三&#xff09;自定义协议的实现 1、基础类 2、序列化与反序列…...

混合专家模型(MoE):高效处理复杂任务的智能架构,DeepSeek性能出色的秘诀

混合专家模型 1. 什么是混合专家模型 混合专家模型&#xff08;Mixture of Experts&#xff0c;简称 MoE&#xff09; 是一种先进的神经网络架构&#xff0c;旨在通过整合多个 专门化的子模型&#xff08;或称为“专家”&#xff09; 的预测来提升整体模型性能。其核心思想是…...

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统&#xff0c;可以分为以下几个步骤&#xff1a; 1. 系统架构设计 前端&#xff1a;使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端&#xff1a;使用 Spring Boot 提供 RESTful API&#xff0c;负责与…...

C++ 内存序在多线程中的使用

目录 一、内存顺序 二、 指令重排在多线程中的问题 2.1 问题与原因 2.2 解决方案 三、六种内存序 3.1 memory_order_relaxed 3.2 memory_order_consume 3.3 memory_order_acquire 3.4 memory_order_release 3.5 memory_order_acq_rel 3.6 memory_order_seq_cst 一、…...

【MySQL】表的操作

文章目录 &#x1f449;表的操作&#x1f448;创建表查看表修改表删除表 &#x1f449;表的操作&#x1f448; 创建表 create tabletable_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a;…...

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…...

DeepSeek-R1本机部署(VLLM+OpenWebUI)

本文搭建环境 系统&#xff1a;Ubuntu 22.04.4 LTS Python版本&#xff1a;Python 3.10 显卡&#xff1a;RTX 4090D 一、DeepSeek-R1-14b原始模型和q8量化模型 1.从modelscope下载模型 官方原始模型&#xff1a;https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Di…...

计算机网络软考

1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据&#xff0c;自下而上的解封装数据&#xff0c;实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中&#xff0c;用高电平代表 “1”、低电平代表 “0”&#xff0c…...

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…...

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…...

爬虫去重:数据采集时如何进行去重,及去重优化策略

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 去重的核心思路2. 常见的去重方法2.1 基于集合(Set)的去重2.2 基于布隆过滤器(Bloom Filter)的去重2.3 基于数据库的去重2.4 基于文件存储的去重2.5 基于 Redis 的去重3. 去重的优化策略3.1 URL 规范化3.2 分片去…...

IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题

文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek&#xff08;Ollama方式&#xff09;2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…...

【电子基础】运算放大器应用笔记(持续更新)

目录 运放应用1&#xff1a; 运放基础知识同相比例运算放大器计算放大倍数 电压比较器 运放应用2&#xff1a;500W调压器同相比例运算放大器计算放大倍数计算平衡电阻 积分电路 运放应用3&#xff1a;逆变电焊机电压跟随器积分电路 加油站1. 为什么比例运算放大电路要加平衡电阻…...

计算机网络核心知识点:信道容量、OSI模型与调制技术详解

目录 一、信道容量与调制技术 奈奎斯特定理&#xff08;无噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 香农定理&#xff08;有噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 奈奎…...

AI赋能企业协作4-NL2Sql技术路线

1.1 对话即服务的一点思考 在数智化转型的过程中&#xff0c;基于即时通信&#xff08;IM&#xff09;的协作平台正悄然成为企业智能化转型的“新基建”。协作平台天然具备高频交互、实时协同和场景化落地的特性&#xff0c;仿佛是为对话式AI量身定制的试验场——员工在熟悉的聊…...

如何用FFmpeg高效拉流(避坑指南)

FFmpeg作为音视频处理领域的“瑞士军刀”,其拉流功能在直播、监控、流媒体分析等场景中应用广泛。本文从实战角度出发,系统梳理FFmpeg拉流的核心工具链、协议适配技巧及高频踩坑点,助你快速掌握流媒体处理核心技能! 一、FFmpeg拉流工具链全解析 核心工具 ffplay:快速验证…...

面试基础--MySQL SQL 优化深度解析

MySQL SQL 优化深度解析&#xff1a;EXPLAIN、索引优化与分库分表实践 引言 在互联网大厂的高并发场景下&#xff0c;数据库的性能优化是至关重要的。MySQL 作为最流行的关系型数据库之一&#xff0c;SQL 查询的性能直接影响了系统的响应时间和吞吐量。本文将深入探讨 MySQL …...

WebRTC简介

WebRTC简介 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种支持浏览器之间进行实时音视频通信和数据传输的开放标准和技术。它由Google发起&#xff0c;现已成为W3C和IETF的标准。WebRTC允许开发者在不依赖第三方插件或软件的情况下&#xff0c;直接在网页…...

清北deepseek8本手册

“清北手册”通常是“清华大学和北京大学推出的DeepSeek手册”的简写。近期&#xff0c;随着AI技术的迅速发展&#xff0c;清北两高校陆续发布多本自家的DeepSeek学习手册&#xff0c;助力普通人学习进阶。 清华大学的DeepSeek手册已推出5册&#xff0c;内容丰富全面&#xff0…...

前后分离文件上传案例,前端HTML,后端Net6开发的webapi(完整源代码)下载

文件上传功能在项目开发中非常实用&#xff0c;本案例前端用HTML页面的form表单实现&#xff0c;后端用Net6实现。 前后分离文件上传案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代码&#xff09; 下载链接https://download.csdn.net/download/luckyext/9…...

6.过拟合处理:确保模型泛化能力的实践指南——大模型开发深度学习理论基础

在深度学习开发中&#xff0c;过拟合是一个常见且具有挑战性的问题。当模型在训练集上表现优秀&#xff0c;但在测试集或新数据上性能大幅下降时&#xff0c;就说明模型“记住”了训练数据中的噪声而非学习到泛化规律。本文将从实际开发角度系统讲解如何应对过拟合&#xff0c;…...

六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计&#xff08;语义化HTML&#xff09; 2. 响应式布局系统&#xff08;Flex Grid&#xff09; 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…...

java数据结构_再谈String_10

目录 字符串常量池 1. 创建对象的思考 2. 字符串常量池&#xff08;StringTable&#xff09; 3. 再谈String对象创建 字符串常量池 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello&…...

MCP:重塑AI与数据交互的新标准

MCP&#xff1a;重塑AI与数据交互的新标准 前言 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的应用日益广泛&#xff0c;但其与外部数据源和工具的集成却一直面临复杂性和碎片化的挑战。 Anthropic提出的MCP&#xff08;Model Context Protocol&…...

Cursor+Claude3.7实现从原型到app开发

最近在X上看到了一些人在用Claude 3.7 Sonnet生成 app原型图的尝试&#xff0c;受到启发&#xff0c;发现这么先生成不同界面的原型图再让Cursor基于原型图开发app会是很好的尝试。尤其是&#xff0c;你也可以不两步直接生成&#xff0c;而是在过程中更可视化地思考你要生产的原…...

洛谷P1334

题目如下 思路&#xff1a; 每次选择最短的两块木板进行合并&#xff0c;直到只剩下一块木板。使用最小堆&#xff08;优先队列&#xff09;来实现这一过程。使用最小堆&#xff1a; 将所有木板的长度放入最小堆&#xff08;优先队列&#xff09; 每次从堆中取出两块最短的木…...

使用wifi连接手机adb进行调试|不使用数据线adb调试手机|找应用错误日志和操作日志

手机在开发者选项里要开启无线调试 在手机设置中查看WiFi的IP地址 设置 -> WLAN -> 已连接的WiFi -> IP地址 使用手机的IP地址连接 adb connect 192.168.1.12:xxxxx 检查连接状态 adb devices 断开特定设备 adb disconnect 192.168.x.x:xxxxx 断开所有设备 …...

大语言模型中温度参数(Temperature)的核心原理

大语言模型中温度参数&#xff08;Temperature&#xff09;的核心原理是通过调整模型输出的概率分布&#xff0c;控制生成结果的随机性和多样性。以下是其原理的详细说明&#xff1a; 一、定义与核心作用 温度参数是生成式模型&#xff08;如GPT系列&#xff09;中的一个超参数…...

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…...

在Ubuntu上搭建Samba服务,实现与windows之间的文件共享

1.安装samba 首先切换为root账户&#xff0c;就是带#符号的表示当前登录的是root超级用户&#xff1b; su - 如果忘记密码&#xff0c;就输入以下命令修改密码 sudo passwd root 再切换为超级用户 然后进行更新软件列表 sudo apt update sudo apt install samba安装 whe…...

Labview培训案例3: 输出正弦波并采集显示

本案例介绍如何从板卡&#xff08;USB6008&#xff09;的模拟量输出端口输出一个正弦波&#xff0c;然后模拟量输入模块进行采样&#xff0c;然后显示到vi画面的‘波形图’中。 详细代码在&#xff1a;Labview课程3&#xff1a;正弦波输出&采集数据&显示资源-CSDN文库 …...

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;毕竟那都是别人说的&#xff0c;只有自己尝试一次才知道结果。 具体操作 第一步&#xff1a;访问 deepseek 我们访问 deepseek &#xff0c;把我们想要输入的内容告诉…...