策略模式原理与C++实现

定义

定义一些列算法,把他们一个个封装起来,并且使他们可以相互替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展、子类化)。

C++实现

在不考虑策略模式的情况下,我们往往会写出以下代码:

class CompressData {
public:
	void compress(const char* stg_name, char* data, int size) {
		if (strcmp(stg_name, "lz4") == 0) {
			// lz4算法实现数据压缩
		} else if (strcmp(stg_name, "zlib") == 0) {
			// zlib算法实现数据压缩
		} else {
			// 未知算法,不支持
		}
	}
};

可以看出,如果我需要新增一个gzip压缩算法,那么我就需要在代码中新增一段实现gzip算法的代码。这明显违背了开放封闭原则。因此,考虑使用策略模式,代码实现如下:

class Strategy {
public:
	virtual void compress(char* data, int size) = 0;
	virtual ~Strategy() {}
};

class Lz4Strategy : public Strategy {
public:
	void compress(char* data, int size) 
	{
		// Lz4压缩算法实现
	}	
};

class ZlibStrategy : public Strategy {
public:
	void compress(char* data, int size)
	{
		// zlib压缩算法实现
	}
};

class GzipStrategy : public Strategy {
public:
	void compress(char* data, int size)
	{
		// Gzip压缩算法实现
	}
};

上述代码表明为每个策略单独创建一个类,这样在新增策略时,就只需要进行扩展即可。再来看CompressData类(上下文程序)如何实现。

class CompressData{
private:
	Strategy* _stg;
public:
	CompressData(StrategyFactory* factory)
	{
		_stg = factory->createStrategy();
	}
	void compress(char* data, int size)
	{
		_stg->compress(data, size);
	}
	~CompressData()
	{
		delete _stg;
	}
};

这里会用到工厂方法模式,客户程序在选择使用何中压缩算法时,是根据传入的工厂来决定的。到这里我们可以看出来,新增一个压缩策略,只需要扩展一个对应的压缩算法类即可,并不需要修改上下文程序。

类图

请添加图片描述
其中Context就是上下文程序,是稳定的,所有具体的策略都继承自抽象的策略,是变化的。因此新增策略,只需要对代码进行扩展即可。

总结

  • Strategy及其子类为组件提供了一系列可重用的算法,使得类型在运行时方便的根据需要在各算法之间切换。
  • 策略模式消除了条件判断语句,含有许多条件判断的语句往往可以使用策略模式来解耦合。
  • 如果Strategy对象没有数据成员,那么各个上下文之间可以共享同一个Strategy对象,从而节省对象开销。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

SAP 银企直连--FBPM生成付款文件增强

需求描述: SAP中通过运行事务码FBPM生成付款文件,触发传输将文件写入跳板机,写入跳板机之前,检查文件是否已存在,存在则给出提示无需执行 实现步骤 : 文件校验 参照标准函数FI_PAYMEDIUM_SAMPLE_21 创建自…

Vision Pro的增强视觉:企业级Unity插件包实现主摄像头访问

在AR和VR技术的快速发展中,Unity作为跨平台游戏和应用开发的首选引擎,其插件生态的丰富性一直是开发者们关注的焦点。最近,一个专为Vision Pro设计的Unity插件包——EnterpriseCameraAccessPlugin,因其能够通过企业API访问主摄像头的功能,引起了广泛关注。 一、插件背景与…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

[Linux] yum和vim

文章目录 yumyum是什么?linux系统(Centos)的生态 vimvim是什么?vim配置 yum yum是什么? yum是一个下载安装及卸载管理软件的客户端。类似如应用商店 linux系统(Centos)的生态 Centos下载方式3种:源代…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【27】【内网穿透】cpolar 内网穿透cpolar内网穿透联调配置练习—使用公网地址访问gulimall.com参考 内网穿透 正常的外网需要访问我们项目的流程是: 买服务器并且有公网固定…

Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?

题意:为什么我无法通过API访问GPT-4模型,尽管GPT-3.5模型可以工作? 问题背景: Im able to use the gpt-3.5-turbo-0301 model to access the ChatGPT API, but not any of the gpt-4 models. Here is the code I am using to tes…

PyCharm在线版,一周使用总结!!!

前言 过去一周,对pycharm在线版进行了使用,对云原生开发工具有了全新的认识,云原生开发是一种现代化的软件开发和部署方法,它充分利用了云计算的优势,特别是容器化、微服务、持续集成/持续部署(CI/CD&…

数据结构之线性表表示集合详解与示例(C,C#,C++)

文章目录 基本特征线性表的特点:线性表的表示方法:C、C#和C语言如何实现一个线性表表示集合1. C实现2. C#实现3. C实现 总结 线性表是计算机数据结构中的一个基本概念,它是一种最简单的抽象数据类型。在线性表中,数据元素之间的关…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库,它可以用来处理流式数据,进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

【AI绘画教程】Stable Diffusion 1.5 vs 2

在本文中,我们将总结稳定扩散 1 与稳定扩散 2 辩论中的所有要点。我们将在第一部分中查看这些差异存在的实际原因,但如果您想直接了解实际差异,您可以跳下否定提示部分。让我们开始吧! Stable Diffusion 2.1 发布与1.5相比,2.1旨在解决2.0的许多相对缺点。本文的内容与理解…

LabVIEW机器学习实现外观检测

介绍如何利用LabVIEW平台结合机器学习技术实现对被测样品的外观检测。详细说明了硬件选择、算法使用、操作步骤以及注意事项。 硬件选择 工业相机:高分辨率工业相机(如Basler、FLIR等)用于采集样品的图像。 照明设备:均匀的LED照…

C++深度解析教程笔记9-静态成员变量,静态成员函数,二阶构造,友元,函数重载,操作符重载

C深度解析教程笔记9 第25课 - 类的静态成员变量实验-数对象个数(失败)实验-静态变量小结 第26课 - 类的静态成员函数实验-修改对象的静态变量数值实验-利用静态成员函数实验-静态变量静态函数实现统计对象个数小结 第27课 - 二阶构造模式实验-初始化是否…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法:我们得榨干这本书的知识。 带着问题 为了更好的学习,我们最好带着问题去探索。 第一:核心问题与基础知识 如上图:这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理:…

redis登录缓存

1.pom.xml中引入redis依赖 <!-- Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.将登录成功的token存储到redis中 if(Md5…

Vue和Element UI 路由跳转

在Vue.js中&#xff0c;使用Vue Router可以方便地实现页面之间的路由跳转。Element UI是一个基于Vue 2.0的桌面端组件库&#xff0c;它本身并不直接提供路由跳转的功能&#xff0c;但你可以在使用Element UI的Vue项目中结合Vue Router来实现这一功能。 以下是一个基于Vue和Ele…

文心一言:如何备考软考架构师

提问&#xff1a;软考高级:架构师指导&#xff0c;有哪些考点、重点考点有哪些&#xff1f;需要如何备考&#xff1f;案例分析题如何做&#xff1f;论文如何写&#xff1f; 文心一言回答1700字如下&#xff1a; 针对软考高级架构师的考试&#xff0c;以下是对考点、重点考点、备…

vue3插件vue3-video-play报错

安装完插件vue3-video-play&#xff0c;运行时报错 Failed to resolve entry for package "vue3-video-play". The package may have incorrect main/module/exports specified in its package.json. 问题 解决方法&#xff1a; 修改node_modules\vue3-video-play\…

论文翻译 | Successive Prompting for Decomposing Complex Questions 分解复杂问题的连续提示

摘要 回答需要做出潜在决策的复杂问题是一项具有挑战性的任务&#xff0c;尤其是在监督有限的情况下。 最近的研究利用大型语言模型&#xff08;LMs&#xff09;的能力&#xff0c;在少量样本设置中通过展示如何在单次处理复杂问题的同时输出中间推理过程&#xff0c;来执行复杂…