详解C++设计模式编程中策略模式的优缺点及实现

Modern C++ 学习笔记——C++面向对象编程 结合三种设计模式,让你更加理解C++面向对象的特性,建议收藏~~~!!! ModernC++学习笔记是一系列介绍现代C++新特性的文章,结合《effective modern C++》说明了如何更好的使用这些新特性。相互讨论,共同学习,不断成长 阅读详情

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

策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。策略模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。策略模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。State 模式也有类似的功能,他们之间的区别将在讨论中给出。
UML图:
在这里插入图片描述
优点:
1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象

实现示例:

#include <iostream>
#include <string>
#include <memory>
using namespace std;

class Strategy
{
public:
	virtual string substitute(string str) = 0;
	virtual ~Strategy()
	{
		cout << " in the destructor of Strategy" << endl;
	}
};

class ChineseStrategy : public Strategy
{
public:
	string substitute(string str)
	{
		int index = str.find("520");
		string tempstr = str.replace(index, 3, "我爱你");
		return tempstr;
	}

	~ChineseStrategy()
	{
		cout << "in the destructor of ChineseStrategy" << endl;
	}
};

class EnglishStrategy : public Strategy
{
public:
	string substitute(string str)
	{
		int index = str.find("520");
		string tempstr = str.replace(index, 3, "i love you");
		return tempstr;
	}

	~EnglishStrategy()
	{
		cout << " in the destructor of EnglishStrategy" << endl;
	}
};

class Translator
{
private:
	unique_ptr<Strategy> strategy;

public:
	~Translator()
	{
		cout << " in the destructor of Translator" << endl;
	}

	void set_strategy(unique_ptr<Strategy>& strategy)
	{
		this->strategy = std::move(strategy);
	}

	string translate(string str)
	{
		if (strategy.get() == nullptr)
		{
			return "";
		}
		return strategy->substitute(str);
	}
};

int main(int argc, char *argv)
{
	string str("321520");
	Translator *translator = new Translator();
	cout << "No Strategy" << endl;
	translator->translate(str);
	cout << "-----------------------" << endl;

	unique_ptr<Strategy> s1(new ChineseStrategy);
	translator->set_strategy(s1);
	cout << "Chinese Strategy" << endl;
	cout << translator->translate(str) << endl;
	cout << "------------------------" << endl;

	unique_ptr<Strategy> s2(new EnglishStrategy);
	translator->set_strategy(s2);
	cout << "English Strategy" << endl;
	cout << translator->translate(str) << endl;
	cout << "-------------------------" << endl;

	delete translator;
	return 0;
}

(原文用的是auto_ptr,我将其改成unique_ptr)
运行结果:
在这里插入图片描述
关于策略模式的讨论

可以看到策略模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,策略模式和 Template 模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。这两种方式各有优缺点,先列出来:
1.继承:
优点:易于修改和扩展那些被复用的实现。
缺点:①破坏了封装性,继承中父类的实现细节暴露给子类了;②"白盒"复用,原因在 1)中;③当父类的实现更改时,其所有子类将不得不随之改变;④从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。
2.组合:
优点:①"黑盒"复用,因为被包含对象的内部细节对外是不可见的;②封装性好,原因为 1);③实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);④可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类的指针)。
缺点:系统中对象过多。

从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(FavorComposition Over Inheritance)。

实际上,继承是一种强制性很强的方式,因此也使得基类和具体子类之间的耦合性很强。例如在模板方法模式中在 ConcreteClass1 中定义的原语操作别的类是不能够直接复用(除非你继承自 AbstractClass,具体分析请参看模板方法模式文档)。而组合(委托)的方式则有很小的耦合性,实现(具体实现)和接口(抽象接口)之间的依赖性很小,例如在本实现中,ConcreteStrategyA 的具体实现操作很容易被别的类复用,例如我们要定义另一个 Context 类 AnotherContext,只要组合一个指向策略的指针就可以很容易地复用 ConcreteStrategyA 的实现了。

我们在 桥接模式的问题和桥接模式的分析中,正是说明了继承和组合之间的区别。请参看相应模式解析。

另外策略模式很状态模式也有相似之处,但是状态模式注重的对象在不同的状态下不同的操作。两者之间的区别就是状态模式中具体实现类中有一个指向 Context的引用,而策略模式则没有。具体分析请参看相应的状态模式分析中。

原文地址:https://www.jb51.net/article/80677.htm

【C++设计模式】Strategy 策略模式详解 策略模式概述 、策略模式结构与实现 、策略模式的应用实例:模拟影院售票系统 、策略模式的适用场景 、策略模式的优缺点 阅读详情

相关推荐

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2559

设计模式之-策略模式(Strategy)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34409703的博客 501

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1755

策略模式详解

策略模式详解 设计模式总则第一条:对修改关闭,对扩展开放 下图为 随身听播放 – 歌手曲库的模型 , 歌手类可以任意扩展,比如加入张学友,加入张韶涵 对歌手-- sing() --唱歌这件事进行了封闭,不准修改 下面是代码实现: 1.运行 public class RunMainThread { public static void main(String[] args) { ...

清风徐来~~ 我,依然在~ 1209

svn co --depth和svn up --set-depth 只check out下一层文件 只更新指定文件 只更新下一层的用法

svn的工程可能很大 有时我们只需要部分文件即可 这里介绍几个命令 1.svn co(check out) --depth --depth=empty,files,immediates,infinity 假设某svn结构如下 svn://root/PRO/A_dir/a svn://root/PRO/B_dir/b svn://root/PRO/c_file svn co --depth=emptysvn://root/PRO 此时只会在本地check out出 PRO/的空目录。 sv.

cy413026的博客 1万+

[ADS]单端电感和差分电感的感值和Q值计算公式

单端电感和差分电感的感值和Q值计算公式

乾巽的博客 1万+

策略模式(Strategy)

策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。

zhimokf的专栏 1253

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块

欧姆龙耦合器(NX-ECC201)和高速计数模块(NX-EC0132)单独使用。扫描设备添加到Codesys中,会报错,无法自动添加。记录一下,以防忘记。高速的计数保证了位置的准确性,位置准确就能保证裁切的精度,一切的基础就在这儿了,奈何目前只有欧姆龙和倍福能做到这样的波形。

qq_35316470的博客 1390

设计模式(二十二)—— 策略模式(定义、案例分析、特点、缺点)

文章目录前言正文一、定义二、情景假设三、情景分析四、 模式分析(1) 模式特点(2) 模式缺点五、使用情景六、拓展与延申总结 前言 文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。 本篇讲解策略模式。其实非常常见,就是我们常用的撤销模式。 当我们想让系统撤销回退到系统的某一个历史状态,就需要撤销功能,要能实现撤销就必须有所保存历史状态,然后进行覆盖。 正文 一、定义 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,

weixin_43905387的博客 2267

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1856

Android 自动亮度

/则需要从BrightnessConfigure类中读取两个数组源:config_autoBrightnessLevels和config_autoBrightnessDisplayValuesNits。) 或知道其在DisplayPowerController()构造的时候初始化的。曲线设置好了,就应该扔代码里跑起来,模型建起来了,这个过程是咋样的呢?//它将负责曲线的创建,自动背光值的计算等。通过搜索配置关键词(

Android 1487

【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、策略模式简介、 二、策略模式适用场景、 三、策略模式优缺点、 四、策略模式与其它设计模式、 五、策略模式代码示例、 1、促销策略接口、 2、满减促销策略、 3、返现促销策略、 4、空促销策略、 5、促销策略工厂、 6、促销活动、 7、测试类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

Python爬虫实战:爬取携程旅游平台数据,我拆解了动态反爬+Cookie续命(附完整可运行代码)

反爬类型表现形式应对思路sign参数返回403/空数据逆向JS还原加密逻辑Cookie时效登录后1小时Cookie失效定时刷新Cookie/保存登录态行为检测爬取过快触发验证码模拟真人延时/随机点击IP封禁单IP爬取超50条数据被封付费代理池/降低请求频率爬取携程旅游平台数据的核心,不是“简单的HTTP请求”,而是“理解平台的反爬逻辑并合规适配”——从sign参数破解到Cookie维护,再到行为模拟,每一步都是对HTTP协议、前端加密、用户行为的深度理解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1718

设计模式-策略模式-Strategy Pattern

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式的优点包括算法的封装和切换的灵活性,以及算法可独立于使用它的客户端变化。:如果算法的实现非常复杂,或者算法可能会随着时间而变化,策略模式可以帮助管理这种复杂性,使得算法的变化不会影响到使用算法的代码。:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。

wesigj的博客 1458

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

设计模式-策略模式

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

sytdsqzr的博客 1699

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式(C++)详解——策略模式(2)

策略模式(Strategy Pattern)是GoF(Gang of Four)23种经典设计模式中“行为型模式”的核心成员,其核心意图是**将一系列可替换的算法封装为独立组件**,使算法与使用它的“客户”(业务逻辑代码)完全解耦,实现“算法可独立变化、客户无需修改”的目标。在C++中,该模式常用“函数对象(Functor)”“std::function”或“lambda表达式”实现,是“组合优于继承”设计原则的典型实践——例如STL中的std::sort函数,通过接收自定义比较策略(函数/函数对

weixin_42108533的博客 1416

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[C++设计模式] strategy 策略模式

按照陈硕老师的观点,c++里有面向过程编程,面向对象编程和面向接口编程,三种思路都各有其适用场景。 面向过程编程是沿袭C的结构化编程思路,OOP是C++的核心,也是现代高级编程语言的核心。 c++的OO核心是继承和多态,在GUI编程,构建关键类等编程中很有用,但是泛用继承和多态,会增加复用和维护的难度,也会使软件臃肿复杂。 面向接口编程,多采用组合,类之间松耦合,可以简化类别架构,方便复用和

hustyangju的足迹 902

C++编程策略设计模式

策略模式是一种行为设计模式,用于封装可互换的算法,使其独立于客户端变化。核心是通过定义策略接口,将具体算法实现解耦,支持运行时动态切换。该模式包含Context(持有策略)、Strategy(接口)和ConcreteStrategy(实现类)三个角色,适用于需要多种算法变体或避免条件分支的场景。优点包括灵活扩展、代码清晰,但可能增加策略类数量。可通过工厂模式或Lambda表达式优化实现。示例C++代码展示了策略A/B的动态切换,输出对应结果。改进方向包括简化客户端依赖和增强策略管理。

weixin_44311159的博客 820

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

文章目录情景描述 情景描述

Nonpc的博客 1993

C++设计模式高级实践:模板方法与策略模式的深度应用

比如在排序算法中,固定比较和交换的基本流程,将具体的比较策略留给子类实现,从而实现不同的排序算法变体。模板方法模式是一种行为型设计模式,它在一个抽象类中定义了算法的骨架(即模板方法),将某些步骤的实现延迟到具体的子类中。例如,在模板方法模式的算法骨架中,可以引入策略模式,将部分步骤的具体实现封装为策略,实现更加灵活的算法定制。抽象类和子类之间的关系较为紧密,增加了代码的理解难度。在C++中,策略模式通常通过接口类(或抽象类)和具体的策略类来实现,客户端持有策略接口的指针或引用,根据需要切换具体的策略对象。

2501_91651722的博客 819

行为型设计模式之策略模式【设计模式系列】

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。一个系统有许多许多类,而区分它们的只是他们直接的行为。将这些算法封装成一个一个的类,任意地替换。在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。

weixin_30197685的博客 1874

C++ 设计模式实用指南(五)

模板方法是经典的四人帮设计模式之一,或者更正式地说,是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 在《设计模式 - 可复用面向对象软件元素》一书中描述的 24 个模式之一。它是一种行为设计模式,意味着它描述了不同对象之间通信的方式。作为面向对象的语言,C++当然完全支持模板方法模式,尽管本章将阐明一些特定于 C++的实现细节。本章将涵盖以下主题:模板方法模式是什么,它解决了什么问题?什么是非虚接口?你应该默认将虚函数设置为公有、私有还是保

龙哥盟 1005

Linux C++ 046-设计模式之策略模式

本节关键字:Linux、C++、设计模式、策略模式 相关库函数:

Tianwx的博客 709

深入解析 C++ 设计模式:原理、实现与应用

所谓设计模式:其实就是利用多态,实现各种不同的操作方式

weixin_45136594的博客 879
上一篇: C++设计模式之策略模式
下一篇: QML歌词从左到右变色效果
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值