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

《C++设计模式》策略模式 介绍了C++模式的策略模式 阅读详情

转自:https://www.jb51.net/article/55998.htm

前言

刚刚加班回来;哎,公司规定平时加班只有10块钱的餐补;星期六和星期天加班,只给串休假;在国家规定的节假日按照3倍工资发放。那么对于这么多的计算加班费的方法,公司的OA系统是如何进行做的呢?这就要说到今天我这里总结的策略设计模式了。

策略模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。

策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况。就像上面的加班工资,不同的加班情况,有不同的算法。我们不能在程序中将计算工资的算法进行硬编码,而是能自由的变化的。这就是策略模式。
在这里插入图片描述
Strategy:定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法;
ConcreteStrategy:实现Strategy接口的具体算法;
Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。

使用场合

当存在以下情况时使用Strategy模式:

1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法;
2.需要使用一个算法的不同变体;
3.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构;
4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以替代这些条件语句。(是不是和状态模式有点一样哦?)
代码实现
首先实现最单纯的策略模式,代码如下:

#include <iostream>
using namespace std;

class Strategy
{
public:
	virtual void AlgorithmInterface() = 0;
};

class ConcreteStrategyA : public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyA." << endl;
	}
};

class ConcreteStrategyB :public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyB." << endl;
	}
};

class ConcreteStrategyC : public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyC." << endl;
	}
};

class Context
{
public:
	Context(Strategy *pStrategyArg) : pStragegy(pStrategyArg)
	{}

	void ConcreteInterface()
	{
		pStragegy->AlgorithmInterface();
	}
private:
	Strategy *pStragegy;
};

int main()
{
	Strategy *pStrategyA = new ConcreteStrategyA();
	Strategy *pStrategyB = new ConcreteStrategyB();
	Strategy *pStrategyC = new ConcreteStrategyC();

	Context *pContextA = new Context(pStrategyA);
	Context *pContextB = new Context(pStrategyB);
	Context *pContextC = new Context(pStrategyC);

	pContextA->ConcreteInterface();
	pContextB->ConcreteInterface();
	pContextC->ConcreteInterface();

	if (pStrategyA)
		delete pStrategyA;

	if (pStrategyB)
		delete pStrategyB;

	if (pStrategyC)
		delete pStrategyC;

	if (pContextA)
		delete pContextA;

	if (pContextB)
		delete pContextB;

	if (pContextC)
		delete pContextC;
}

运行结果:
在这里插入图片描述
在实际操作的过程中,我们会发现,在main函数中,也就是在客户端使用策略模式时,会创建非常多的Strategy,而这样就莫名的增加了客户端的压力,让客户端的复杂度陡然增加了。那么,我们就可以借鉴简单工厂模式,使策略模式和简单工厂模式相结合,从而减轻客户端的压力,代码实现如下:

#include <iostream>
using namespace std;

typedef enum StrategyType
{
	StrategyA,
	StrategyB,
	StrategyC
}STRATEGYTYPE;

class Strategy
{
public:
	virtual void AlgorithmInterface() = 0;
	virtual ~Strategy() = 0;
};

Strategy::~Strategy() {}

class ConcreteStrategyA : public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyA." << endl;
	}
	~ConcreteStrategyA() {}
};

class ConcreteStrategyB :public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyB." << endl;
	}
	~ConcreteStrategyB() {}
};

class ConcreteStrategyC : public Strategy
{
public:
	void AlgorithmInterface()
	{
		cout << "I am from ConcreteStrategyC." << endl;
	}
	~ConcreteStrategyC() {}
};

class Context
{
public:
	Context(STRATEGYTYPE strategyType)
	{
		switch (strategyType)
		{
		case StrategyA:
			pStragegy = new ConcreteStrategyA;
			break;

		case StrategyB:
			pStragegy = new ConcreteStrategyB;
			break;

		case StrategyC:
			pStragegy = new ConcreteStrategyC;
			break;

		default:
			break;
		}
	}

	~Context()
	{
		if (pStragegy)
		{
			delete pStragegy;
		}
	}

	void ContextInterface()
	{
		if (pStragegy)
		{
			pStragegy->AlgorithmInterface();
		}
	}

private:
	Strategy *pStragegy;
};

int main()
{
	Context *pContext = new Context(StrategyA);
	pContext->ContextInterface();

	if (pContext)
	{
		delete pContext;
	}
	return 0;
}

在这里插入图片描述
在上面这个代码中,其实,我们可能看到的更多的是简单工厂模式的应用,我们将策略模式将简单工厂模式结合在了一起,让客户端使用起来更轻松。

总结

策略模式和状态模式,是大同小异的;状态模式讲究的是状态的变化,和不同状态下,执行的不同行为;而策略模式侧重于同一个动作,实现该行为的算法的不同,不同的策略封装了不同的算法。策略模式适用于实现某一功能,而实现该功能的算法是经常改变的情况。在实际工作中,遇到了实际的场景,可能会有更深的体会。比如,我们做某一个系统,该系统可以适用于各种数据库,我们都知道,连接某一种数据库的方式是不一样的,也可以说,连接数据库的“算法”都是不一样的。这样,我们就可以使用策略模式来实现不同的连接数据库的策略,从而实现数据库的动态变换。

转自:https://www.jb51.net/article/55998.htm

策略模式(附C++代码示例) 阅读详情

相关推荐

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

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大

wuzhekai的专栏 5万+

策略模式和工厂模式的区别

工厂模式和策略模式看着很像,经常让人混淆不清; 它们的区别在哪里,需要细细体味; 相似点 在模式结构上,两者很相似; 差异 用途不一样 工厂是创建型模式,它的作用就是创建对象; 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为; 关注点不一样 一个关注对象创建 一个关注行为的封装 ...

weixin_30467087的博客 409

5种主流触觉传感器对比:GelSight、DIGIT、Taxim、GelSlim和TACTO怎么选?

本文深度对比了GelSight、DIGIT、Taxim、GelSlim和TACTO五种主流触觉传感器的技术原理与应用场景。针对机器人及VR项目的选型需求,文章从光学与电子传感的技术分野出发,分析了各传感器在分辨率、响应速度、集成难度和成本上的核心差异,并提供了从需求出发的实战选型决策框架,帮助开发者找到最适合的触觉解决方案。

weixin_29268637的博客 699

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

策略模式的介绍和使用

wangdamingll的博客 2569

frp内网穿透(socks隧道)

在实验过程中还是遇到了挺多的问题,但好在大多都解决了。不过还是遗留了一些不懂的问题,等以后再慢慢研究了。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1万+

别再死记硬背菜单了!用Workbench搞定你的第一个ANSYS结构分析(附模型文件)

本文为零基础用户提供使用ANSYS Workbench完成第一个结构分析的完整指南。通过悬臂梁案例详细讲解从几何导入、材料定义、网格划分到边界条件设置的全流程,帮助初学者快速掌握有限元分析的基本操作,并附赠实用模型文件。

weixin_34233974的博客 307

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

引入"策略“设计模式的定义:定义一些列算法类(策略类),将每个算法封装起来,让他们可以互相替换。换句话说,策略模式通常把一系列算法封装到一系列具体策略类中作为抽象策略类的字类,然后根据实际需要适用这些字类。

慢慢记录,慢慢更新。 2726

基于verilog的16QAM调制

思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差...

weixin_30725467的博客 2929

C++设计模式——策略模式(Strategy Pattern)

C++设计模式——策略模式(Strategy Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——策略模式(Strategy Pattern)目录定义实现示例传统的策略模式实现使用函数指针实现策略模式工厂模式和策略模式对比总结参考资料 定义 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换 策略模式是指定

leonardohaig的博客 4776

地图之家总目录

地图之家总目录 cesium示例 leaflet示例

GIS之家家长 1万+

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8281

C++设计模式——策略模式(strategy pattern)

一、原理讲解 1.1意图 定义算法簇,将这些算法封装起来,之间可以相互替换。这样的好处在于,使得算法可以独立于使用它的客户而变化。 1.2与模板方法区别 模板方法主要是继承接口类,而策略模式主要是组合接口类,两种方法核心区别在于,是继承?还是组合? 设计模式八大原则之一:优先使用对象组合,而不是类继承。 1.3设计步骤 a1 先定义一个接口类最为抽象基类ABC a2 定义一系列算法...

净无邪博客 1275

道家学派创始人老子,对 SAP ABAP 这门编程语言的客观评价

SAP HANA 之引入,使 ABAP 于处理大数据,云计算等新兴领域,展现新的生命力,如老吾老以及人之老,幼吾幼以及人之幼,扩展其在信息技术领域的应用,以涵养更广之需。ABAP 能以数据为基,流转于系统之中,如道法自然,顺应企业之生态,助之以高效运转,减少冗杂,简化管理,使企之运营,如小国寡民,无为而治。然 ABAP 如老树盘根,更替不易,面对新兴技术,如云计算、大数据等,其更新之速,未能与时俱进。如水之于渊,柔而能胜刚,ABAP 之发展,顺时而动,应需而变,其在编程领域,犹如道之于万物,渐不可或缺矣。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1031

【c++设计模式22】行为模式7:策略模式(Strategy Pattern)

原创作者:郑同学的笔记原创地址:https://zhengjunxue.blog.youkuaiyun.com/article/details/132920283qq技术交流群:921273910# 一、定义策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。客户端代码在运行时选择所需的算法。

junxuezheng的博客 2042

基于YOLOv11的人脸识别系统:从构建到应用的全流程指南

深度学习是机器学习的一个分支,旨在通过多层神经网络模拟人脑的认知能力。它能够从大量数据中自动提取特征,并进行准确的预测和分类。在计算机视觉领域,深度学习技术已经取得了显著的成果,尤其是在图像识别、目标检测等方面。YOLOv11是YOLO系列模型的最新版本,结合了卷积神经网络(CNN)和其他创新技术。它在保持高精度的同时,显著提高了推理速度。YOLOv11的结构轻量且高效,非常适合实时目标检测任务。人脸检测的目标是从图像或视频中定位所有人脸的位置。

FJN110的博客 184

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《Head First 设计模式》C++实现【策略模式(Strategy Pattern)】

《Head First 设计模式》书中第2章——策略模式(Strategy Pattern)的C++代码实现。 策略模式(Strategy Pattern):定义了算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

Liber-coder的博客 321

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式 策略模式(Strategy Pattern) C++表达

策略模式(Strategy Pattern)是一种行为设计模式,它的核心思想是将一系列相关的算法或行为封装到独立的策略类中,并使得这些策略可以相互替换。主要用来定义一系列可互换的算法或行为。它允许在运行时选择和切换这些算法或行为,而不用修改使用它们的代码。策略模式就像给的代码提供了一组不同的工具,每个工具都可以完成相似的工作(例如不同的送货方式)。可以根据需要随时更换这些工具,而不需要修改太多代码。

二分掌柜的 1141

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++ 设计模式:策略模式(Strategy Pattern)

C++ 设计模式:策略模式(Strategy Pattern)

冀晓武的博客 1006

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

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

L_qingting的博客 1182

c++ 设计模式——策略模式

c++设计模式——策略模式 定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们相互之间可以替换。策略模式让算法独立于使用它的客户而独立变化。 角色 抽象策略角色(strategy):抽象策略类 具体策略角色(concrete strategy):封装了相关的算法和行为 环境角色(context):持有一个策略类的引用,最终给客户端调用 模式图 应用场景 ...

weixin_44767770的博客 304

C++23种设计模式之策略模式

以下内容全部来自传智播客的C++设计模式讲义: 4.4策略模式 概念 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。 角色和职责 Strategy: 策略(算法)抽象。 Co...

qq_15054345的博客 508

c++设计模式之策略模式

策略模式是一种行为型设计模式,它可以让用户定义一系列算法,并将每个算法独立的封装成独立的类,使他们可以互相替换。这种模式让算法的变化独立与使用算法的前端。

漫步者 1431

23种设计模式C++实例之策略模式

【代码】23种设计模式C++实例之策略模式。

寒风的技术博客 1880

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

在策略模式中,我们首先定义一个抽象基类或接口,它代表着所有可能被应用的算法的共性。然后我们编写具体的子类实现这个接口,并实现各自的算法函数。最后我们编写一个环境类或者上下文类,该类持有一个指向抽象基类或接口类型的指针,客户端可以传递不同的具体算法对象给环境类,从而动态地改变其行为。策略模式的优势在于可以将算法的实现和使用分离,方便客户端动态地替换策略对象,并且可以避免使用多重条件语句来选择不同的算法实现。

hzdxyh的博客 592

23种设计模式c++实现(2)策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 它定义了算法家族,分别封装起来,让它们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的客户。策略模式应该是面相过程的思维方式,到面向对象的思维方式转换的最直接的一个例子。封装出一个良好的接口给客户端使用,而底层算法的改变,不会影响到客户端。 UML结构图 应用场景 有一系列的算法方法,但从概念上来看,这些方法都解决的都是相同的工作...

请叫我少爷的博客 244

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

策略模式是一种行为设计模式,来源于《设计模式:可复用面向对象软件的基础》一书。它定义了一组算法,并将它们封装成独立的对象。策略模式在标准模板库(STL)中被广泛使用。

GPU全栈博主 883
上一篇: c++简单工厂模式、工厂方法模式与抽象工厂模式的实现和优缺点
下一篇: 详解C++设计模式编程中策略模式的优缺点及实现
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值