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

news2025/1/18 20:15:14

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、策略模式是什么?

       策略模式是一种行为型的软件设计模式,针对某个行为,在不同的应用场景下,有不同的实现算法,并且可以互相替换。比如两军交战,军队会采用不同的阵法、策略、兵法应对不同的战况。

       策略模式的优点:

  1. 便于管理算法族。一套策略对应一套算法,该模式可以很好地进行维护和管理。
  2. 避免使用多重条件语句,如if else和switch。庞大的系统中,过多的多重条件语句会让代码显得臃肿和不易维护,提高出错概率。
  3. 封装算法。提高了算法的保密性和安全性。
  4. 符合开闭原则。

      策略模式的缺点:

  1. 客户端需要了解每种策略,并自行决定何时何地使用何种策略。
  2. 随着策略增多,策略类数量增加,要注意对类的维护。

二、策略模式

2.1 结构图

       客户端即Main主函数,根据不同场景选用不同策略。

2.2 代码示例

       场景描述:我有一支军队,先让其使用火攻震慑对方,再用离间策反敌人。

//Strategy.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>

using namespace std;

// 策略类型
enum WARCRAFT_TYPE
{
	FIREATTACK,                    // 火攻
	SOWDISCORD,					   // 离间
};

// 定义策略接口-兵法
class Warcraft 
{
public:
	// 执行
	virtual void execute() = 0;
};

// 实现具体策略类-火攻
class FireAttack : public Warcraft 
{
public:
	// 执行
	virtual void execute() {
		cout << "执行'火攻'!" << endl;
	}
};


// 实现具体策略类-离间
class SowDiscord : public Warcraft 
{
public:
	// 执行
	virtual void execute() {
		cout << "执行'离间'!" << endl;
	}
};

// 背景类-军队
class Army 
{
public:
	// 构造函数
	Army(WARCRAFT_TYPE type){
		setWarcraft(type);
	}

	// 析构函数
	~Army() {
		if(m_warcraft) {
			delete m_warcraft;
			m_warcraft = nullptr;
		}
	}

	// 设置策略
	void setWarcraft(WARCRAFT_TYPE type) {
		// 清空旧策略
		if (m_warcraft) {
			delete m_warcraft;
			m_warcraft = nullptr;
		}
		// 使用新策略
		switch (type)
		{
		case FIREATTACK:
			m_warcraft = new FireAttack();
			break;
		case SOWDISCORD:
			m_warcraft = new SowDiscord();
			break;
		default:
			cout << "没有该策略。" << endl;
			break;
		}
	}

	// 执行兵法
	void executeWarcraft() {
		cout << "准备!" << endl;
		m_warcraft->execute();
		cout << "结束!" << endl;
	}

private:
	Warcraft* m_warcraft;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Strategy.h"

using namespace std;

int main()
{
	Army *army = new Army(FIREATTACK);
	army->executeWarcraft();
	army->setWarcraft(SOWDISCORD);
	army->executeWarcraft();
	delete army;
	army = nullptr;
	return 0;
}

       程序结果如下。

       策略模式的实现有很多种,我是采用了枚举的形式,将具体策略的创建放在了环境类中,类中new别忘了delete;也可以在客户端创建策略,再将策略指针传入环境类。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对策略模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解策略模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

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

相关文章

win下配置pytorch3d

一、配置好的环境&#xff1a;py 3.9 pytorch 1.8.0 cuda 11.1_cudnn 8_0 pytorch3d 0.6.0 CUB 1.11.0 你可能觉得pytorch3d 0.6.0版本有点低&#xff0c;但是折腾不如先配上用了&#xff0c;以后有需要再说。 &#xff08;后话&#xff1a;py 3.9 pytorch 1.12.1 cuda …

Log4j日志

log4j日志简介组成Logger 日志记录器Appender 日志目的地&#xff08;Windows下的路径分隔符&#xff09;※Layout 日志信息布局layout 指定输出的样式模板&#xff1f;layout.ConversionPattern 指定输出的每项内容及其格式顺序日志信息等级/优先级使用的Log4j的jar包代码示例…

BGP路由控制

实验要求 IP地址分配 给所有路由器按要求配置IP地址&#xff0c;AS之间使用AR编号连接作为IP&#xff0c;例如34.0.0.0/30。 在AS123中启动OSPF 启动BGP&#xff0c;并将24网段的路由宣告 R4 [r4]bgp 400 [r4-bgp]peer 24.0.0.2 as-number 123 [r4-bgp]peer 34.0.0.2 as-num…

Qt关于第三方库介绍

文章目录前言一、获取第三方库二、Makefile是什么&#xff1f;三、将第三方库添加到 Qt 项目中四、mingw和msvc的区别五、安装msvc六、安装mingw七、如何使用不同的编译器前言 本专栏的系统为&#xff1a;windows11 qt版本为&#xff1a;qt6.4.2 提示&#xff1a;以下是本篇文…

【从零开始学Skynet】实战篇《球球大作战》(五):gateway代码设计(上)

1、协议格式 在写代码之前&#xff0c;我们要先了解什么是协议&#xff0c;协议就是 “客户端向服务端发起的登录请求”&#xff0c;那么登录请求是什么样子的呢&#xff1f;这得先从TCP数据流说起&#xff0c;客户端发起的请求&#xff0c;就是一些二进制数据。 &#xff08;…

OpenCV实例(六)行人检测

OpenCV实例&#xff08;六&#xff09;行人检测1.行人检测概述2.行人检测基础实现2.1基本流程2.2实现程序2.3参数优化3.完整行人检测程序作者&#xff1a;Xiou 1.行人检测概述 行人检测是目标检测的一个分支。目标检测的任务是从图像中识别出预定义类型目标&#xff0c;并确定…

【Python】json数据解析

目录 json文件数据解析 爬虫获取王者荣耀英雄信息json数据包并解析 爬虫获取抖音视频json数据包并解析 json文件数据解析 json字符串&#xff1a;通常类似python数据类型中的列表和字典的结合&#xff0c;也可能是单独的列表或者字典格式&#xff0c;通常可以通过json模块的…

亚马逊影响搜索排名的主要因素有哪些,使用测评做排名有哪些要求?

亚马逊产品的排名越高就意味着分配的流量越多而且带来更高的销量。那主要有哪些因素影响产品的排名呢&#xff1f; 1、产品销量 产品销量反映了该产品在同类产品中的销售情况&#xff0c;该数值会在产品Listing中展示&#xff0c;平台会每小时更新一次该排行榜。在平台算法看…

【Linux】线程控制分析:如何获取线程ID?线程如何自动回收?

Linux系统中, 线程是轻量级的进程. 我们已经介绍过了线程的相关概念, 见过了线程再Linux操作系统中的存在形式. 我们知道, 进程有自己相关控制接口, 等待、创建等 而线程作为轻量级的进程, 其实也是有控制接口的. 文章目录线程控制线程的创建与回收演示获取线程idpthread_sel…

用户管理系统-自动化测试

文章目录1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计用户管理系统自动化测试用例3.1 准备工具类3.2 测试登录页面3.3 测试用户列表页3.4 测试添加用户页3.5 测试修改用户页3.6 未登录状态4. 自动化测试项目总结4.1 自动化测试项目实现步骤4.2 当前项…

图数据库驱动的基础设施运维实操

本文系图技术在大型、复杂基础设施之中 SRE/DevOps 的实践参考&#xff0c;并以 OpenStack 系统之上的图数据库增强的运维案例为例&#xff0c;揭示图数据库、图算法在智能运维上的应用。本文所有示例代码开源。 最近&#xff0c;有些尚未使用过图技术、DevOps/Infra 领域的工程…

除了Java,还可以培训学习哪些IT技术?

除了Java&#xff0c;还可以培训学习哪些IT技术&#xff1f;转行IT学Java似乎已经成为很多人的首选&#xff0c;原因无非是开发技术含量高、开发有前景、开发是一个互联网企业的核心岗位&#xff0c;最重要的是开发薪资待遇高。但其实只单纯因为薪资选择Java的话&#xff0c;小…

Flask数据迁移详细步骤

数据迁移详细步骤&#xff1a; 1. 安装好数据迁移的包 flask-sqlalchemy和flask-migrate Flask模型相关包安装 2. 在exts.py中初始化Migrate和SQLAlchemy 3. 在models中定义好模型 4. 在views.py中一定要导入models模块 from .models import * 5. 配置好数据库&#xff08;sql…

MYSQL笔记01 数据库概述,SELECT语句,运算符,排序与分页,多表查询

数据库概述 为什么要使用数据库 持久化&#xff1a;把数据保存在可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以"固化"&#xff0c;而持久化的实现过程大多通过各种关系数据…

详解 23 种设计模式(多图 + 代码)

创建型模式 创建型模式的作用就是创建对象&#xff0c;说到创建一个对象&#xff0c;最熟悉的就是 new 一个对象&#xff0c;然后 set 相关属性。但是&#xff0c;在很多场景下&#xff0c;我们需要给客户端提供更加友好的创建对象的方式&#xff0c;尤其是那种我们定义了类&a…

每68个孩子里,就有一个自闭症,“来自星星的孩子”,离我们很近

今年4月2日是世界上第14个“世界自闭症日”。自闭症儿童&#xff0c;又称“星星儿童”&#xff0c;形容他们像遥远的星星一样独自在夜空中闪耀。自闭症并不少见根据世卫组织的调查&#xff0c;世界上每160名儿童中就有一人患有自闭症。根据《中国自闭症&#xff08;自闭症&…

【从零开始学Skynet】基础篇(四):网络模块常用API

游戏服务端要处理客户端请求&#xff0c;作为服务端引擎&#xff0c;网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API&#xff0c;常用的API如下表所示&#xff1a;Lua API说明socket.listen(address ,port)监听一个端口&#xff0c;返回…

你需要知道的企业网页制作流程

企业网页制作是企业建立线上形象和宣传的重要手段之一&#xff0c;它不仅可以提高企业的品牌知名度&#xff0c;还可以扩大企业的影响力和拓展客户群。下面&#xff0c;我们将介绍一些企业网页制作的基本流程和技巧&#xff0c;并结合一个案例来详细解析。 企业网页制作的基本…

【DT】蒸脱机的结构和工作原理

DT蒸脱机的结构和工作原理什么是DTDT结构图工作过程什么是DT DT 蒸脱机&#xff08;DesolventazationerToaster&#xff09;&#xff0c;根据英文名可以看出来&#xff0c;他的作用是脱溶、烘烤。用于蒸脱湿豆粕中的溶剂。 大豆油生产工艺有2种&#xff1a;压榨油的加工工艺是…

C++标准库--IO库(Primer C++ 第五版 · 阅读笔记)

C标准库--IO库(Primer C 第五版 阅读笔记&#xff09;第8章 IO库8.1、IO类8.2、文件输入输出8.3、string流总结&#xff1a;第8章 IO库 8.1、IO类 为了支持这些不同种类的IO处理操作&#xff0c;在istream和ostream之外&#xff0c;标准库还定义了其他一些IO类型。 如下图分…