c++实现策略模式

news2025/1/15 23:23:30

前言

看了一会儿大话设计模式,我感觉平常的话,策略模式还挺常用的,记录一下。个人理解策略模式,就是抽象一个算法,然后你可以有很多不同的实现,这些实现去重写抽象算法的虚方法。然后在一个上下文类中有一个抽象算法的指针,根据客户端输入参数的不同,去动态决定使用哪个具体的实现,客户端调用的函数在内部其实就是抽象算法指针指向的类的具体实现。这样就可以无限扩展不同的实现方式了,而客户端的接口不用变,只需要改变约定的参数。

代码

#include<iostream>

class MaskMatchStrategy // MaskMatch的算法抽象
{
public:
	virtual void do_mask_match() = 0;
};

// 实现具体算法1
class RigidMaskMatch :public MaskMatchStrategy
{
	void do_mask_match() override {
		std::cout << "执行rigid mask match" << std::endl;
	}
};

// 实现具体算法2
class DeformableMaskMatch :public MaskMatchStrategy
{
	void do_mask_match() override {
		std::cout << "执行deformable mask match" << std::endl;
	}
};

// 客户端调用MaskMatch的类, 只需要给客户端看的
class MaskMatchContext
{
private:
	MaskMatchStrategy* _mask_match_strategy;
	int _type_param;

public:
	void do_mask_match() 
	{
		if (_mask_match_strategy != nullptr) {
			_mask_match_strategy->do_mask_match();
		}
		else {
			std::cout << "参数设置有误, type_param="<<_type_param
				<<" : [未支持的参数]"
				<< std::endl;
		}
	}

	// 由构造函数传入参数
	MaskMatchContext(int type_param=0);// 设置默认参数

	~MaskMatchContext()
	{
		delete _mask_match_strategy;
		std::cout << "MaskMatchContext deconstructor complete" << std::endl;
	}
};


MaskMatchContext::MaskMatchContext(int type_param):_type_param(type_param)
{
	switch (type_param)
	{
	case 0:
		_mask_match_strategy = new RigidMaskMatch;
		break;
	case 1:
		_mask_match_strategy = new DeformableMaskMatch;
		break;
	default:
		_mask_match_strategy = nullptr;
		break;
	}
}

int main()
{
	MaskMatchContext c;
	c.do_mask_match();

	return 0;
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IT服务管理中怎样选择ITSM软件?

对于什么是一个新ITSM工具最重要的选择标准&#xff0c;业界都有不同的看法。其中67%的服务台用户认为是产品的特性和功能&#xff0c; 65%认为是自助服务功能&#xff0c;53%的人认为是轻松配置和定制的能力&#xff0c;45%的人认为是获得高质量的支持&#xff0c;45%的人认为…

Java入门篇 之 逻辑控制

博主的文章希望对大家有所帮助 今日份励志文案:凌空虚度&#xff0c;难成千秋伟业&#xff1b;求真务实&#xff0c;方能善作善成 冲冲冲&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 一.if~else语句 1.1.if-else语句基本用法&#xff1a; 1.2.代码…

C语言字符串详解

字符串详解 定义 输入输出 思考一&#xff1a; 思考二&#xff1a; 思考三 字符串的转义字符 思考四 常见的字符串函数 strcpy 拷贝数组 strlen 输出字符串长度 strcat 连接俩个字符串 strcmp 比较俩个字符串的大小 strupr 把字符串里面的小写转换成大写形式 s…

[ZenTao]禅道邮件通知设置

代码增加通知设置节点 module/message/config.php

正则表达式的使用实例

正则表达式的使用实例 1- 表示2- 实例 1- 表示 1, [:digit:] 表示0-9全部十个数字 //等价于 0123456789&#xff0c; 而不等价于[0123456789] 2, [[:digit:]] 表示任意一个数字 \{m,n\} 表示其前面的字符出现最少m次&#xff0c;最多n次的情况 \{3,\} 其前面的字符出…

git命令清单

一、设置和配置 1.初始化一个新的仓库&#xff1a; git init2.克隆&#xff08;Clone&#xff09;一个远程仓库到本地&#xff1a; git clone <repository_url>3.配置用户信息&#xff1a; git config --global user.name "Your Name" git config --global…

SpringBoot / Vue 对SSE的基本使用

一、SSE是什么&#xff1f; SSE技术是基于单工通信模式&#xff0c;只是单纯的客户端向服务端发送请求&#xff0c;服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放&#xff0c;等数据更新的时候才返回给客户端&#xff0c;当客户端接收到消息后&#xff0c;再…

深入内核buddy分配器(芯驰X9/杰发8015 buddy系统明明还有几十M到100多M内存,却分配4k内存失败)

如上图内核打印分配4K内存失败&#xff0c;但是normal 类型的buddy系统还有大量内存。居然分配失败。源码分析&#xff1a; 根据logfaddr2line定位到&#xff0c;调用栈为__alloc_pages_slowpath——》get_page_from_freelist——》zone_watermark_fast 可以看到buddy内存低于…

node使用fs模块(一)—— 写入文件的基本使用

文章目录 前言一、写入文件的使用&#xff08;fs.writeFile&#xff09;1.参数说明2.基本使用(1)新建app.js 文件(2)代码如下(3)执行命令(4&#xff09;效果 3.写入文件的同步和异步&#xff08;1&#xff09;默认异步&#xff08;2&#xff09; 同步方法&#xff08;writeFile…

【HeidiSql_01】python在heidisql当中创建新表的注意事项

python在heidisql当中创建新表的注意事项 假设你已经在python当中弄好了所有的结果&#xff0c;并且保存在df_all这个dataframe当中&#xff0c;然后要将其导入数据库当中并创建一张新的表进行保存。 # 构建数据库连接,将merged_df写回数据库 from sqlalchemy import create_e…

5000张照片怎么快速发给别人?分享三个简单的方法!

有的时候我们不得不一次性发送很多图片&#xff0c;一张一张发实在让人头疼&#xff0c;这个时候就需要借助一些图片压缩工具打包成文件压缩包发送。下面介绍了三种好用的方法&#xff0c;一起来看看吧&#xff5e; 方法一&#xff1a;使用微信助手 可以使用微信助手&#xff…

设计思想培养:装饰者模式下的RecyclerView添加头、尾

用一个设计模式培养高复用、低耦合思想 前言Android中的装饰者代码实现第一步&#xff1a;创建装饰器DecorateAdapter第二步&#xff1a;处理头部、中间内容、尾部的绑定关系第三步&#xff1a;装饰器的使用第四步&#xff1a;改进、直接封装一个View出来 总结 前言 一个高复用…

操作系统备考学习 day11 (4.1.1~4.1.9)

操作系统备考学习 day11 第四章 文件管理4.1文件系统基础4.1.1 文件的基本概念文件的属性文件的逻辑结构操作系统向上提供的功能文件如何存放在外存 4.1.2 文件的逻辑结构顺序文件索引文件索引顺序文件 4.1.3 文件目录文件控制块单级目录结构两级目录结构多级目录结构 又称树形…

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup

文章目录 Web前端验证PHP_Try MiscHelloWorld密码在这easy_log Cryptobaser 线下“断网”CTF个人赛&#xff0c;题都很简单(新手级难度)&#xff0c;总共10道题目&#xff0c;解了6题。 赛题附件请自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lgNEBO7a1L4KLE2t…

Chrome如何解决http自动转为https问题

开发中总遇到http被浏览器转为https导致无法访问404 具体配置如下&#xff1a; 就能正常访问你的http不安全地址

逻辑(css3)_强制不换行

需求 如上图做一个跑马灯数据&#xff0c;时间、地点、姓名、提示文本字数都不是固定的。 逻辑思想 个人想法是给四个文本均设置宽度&#xff0c;不然会出现不能左对齐的现象。 此时四个文本均左对齐&#xff0c; 垂直排列样式也比较好看&#xff0c;但是出现一个缺点&#…

eDNA放大招:看完这篇文献,你的茶包还香吗?

eDNA在过去几年彻底改变了生物监测领域&#xff0c;一起来看它在生活中的应用吧。节肢动物&#xff08;无脊椎动物&#xff0c;如昆虫、甲壳类等&#xff09;在全球生态系统平衡维护中发挥重要作用。eDNA作为传统节肢动物监测的替代方案发挥出巨大的潜力。 最近一项发表于《Bi…

设备树(以STM32MP1为例)

1.设备树&#xff08;Device Tree&#xff09; 是一种用于描述硬件信息和配置的数据结构&#xff0c;以提供一个统一的方式来描述各种硬件设备的特性和连接方式。 设备树并不是从开始就存在&#xff0c;而是后来加入到Linux中&#xff0c;设备树主要用来描述系统的硬件结构 它是…

Hikari源码分析

总结 连接池关系 1、HikariDataSource构建函数->生成HikariPool对象->调用HikariPool的getConection得到连接 2、HikariPool包含ConcurrentBag 3、ConcurrentBag保存连接&#xff1a;三个集合threadList、sharedList、handoffQueue 4、ConcurrentBag管理连接&#xff1…

maven:编译出现Process terminated解决方法(超全)

maven:编译出现Process terminated解决方法&#xff08;超全&#xff09; 一. 情况一&#xff1a;配置文件 settings. xml 出错&#xff08;解决方法1&#xff09;1.1 项目编译报错如下&#xff1a;1.2 点击【项目名】提示找到出错文件1.3 点击查看出错文件1.4 原因及解决办法 …