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

文章目录

  • 27. 策略模式

运行在VS2022,x86,Debug下。

27. 策略模式

在这里插入图片描述

  • 策略模式让算法的选择与使用独立开来,使得代码更灵活、可扩展和易维护。
  • 应用:如在游戏开发中,AI角色需要根据环境和条件做出不同的行为,如寻路、攻击、躲避等。可以使用策略模式,定义一个行为策略接口,然后分别实现寻路决策类、攻击决策类、躲避决策类等。根据实际情况动态地选择合适的行为策略。
  • 实现
    • 抽象策略类,即定义策略接口。
    • 具体策略类,即实现策略接口。
    • 上下文类,负责使用策略对象。
  • 代码如下。
//抽象策略类:行为策略接口
class AIStrategy 
{
public:virtual void action() = 0;
};//具体策略类:寻路决策类
class FindWayStrategy :public AIStrategy
{
public:void action() { cout << "Finding a way" << endl; }
};//具体策略类:攻击决策类
class AttackStrategy :public AIStrategy
{
public:void action() { cout << "attacking" << endl; }
};//具体策略类:躲避决策类
class AvoidStrategy :public AIStrategy
{
public:void action() { cout << "avoiding" << endl; }
};//上下文类,负责使用策略对象
class Context 
{
private:AIStrategy* aiStrategy; //抽象策略类指针public:void setStrategy(AIStrategy* strategy) { aiStrategy = strategy;} //设置策略void action() const  //行为{if (aiStrategy) { aiStrategy->action();}}
};int main()
{FindWayStrategy* findWayStrategy = new FindWayStrategy();AttackStrategy* attackStrategy = new AttackStrategy();//算法的选择与使用独立开来Context context; context.setStrategy(findWayStrategy); //选择策略1context.action(); //使用context.setStrategy(attackStrategy); //选择策略2context.action(); //使用delete findWayStrategy; delete attackStrategy;return 0;
}

注意 :内存释放问题,这里手动释放子类对象。因为将基类析构函数声明为虚函数,当delete基类指针时,会调用子类析构函数,但它只会释放指向的子类对象(某个策略),其余子类对象是无法释放的(其余策略)。

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

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

相关文章

微型导轨在自动化制造中有哪些优势?

微型导轨在自动化制造中发挥重要作用&#xff0c;能够满足自动化设备制造中对精度要求较高的工艺环节。适用于自动装配线、自动检测设备和机器人操作等环节&#xff0c;推动了行业的进步与发展。那么&#xff0c;微型导轨在使用中有哪些优势呢&#xff1f; 1、精度高和稳定性强…

Vue之组件基础(插槽)

在HTML中&#xff0c;开发者可以在双标签内添加一些信息。而在Vue中&#xff0c;组件以标签的形式引用&#xff0c;那么如何在组件的标签内添加一些信息并将信息渲染到页面中呢?其实&#xff0c;Vue 提供了插槽&#xff0c;专门用来实现这样的效果。 一.什么是插槽 Vue为组件…

【会议征稿】2024年无人驾驶与智能传感技术国际学术会议(ADIST 2024)

2024年无人驾驶与智能传感技术国际学术会议&#xff08;ADIST 2024&#xff09;将于2024年6月28-30日在珠海召开。ADIST 2024旨在搭建学术资源共享平台&#xff0c;加强中外学术合作&#xff0c;促进自动驾驶和智能传感技术的发展&#xff0c;促进全球研究人员、开发人员、工程…

react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 一、首先我们做动态f…

PostgreSQL的学习心得和知识总结(一百四十四)|深入理解PostgreSQL数据库之sendTuples的实现原理及功能修改

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

C# 类型系统

1. 隐式类型 c#允许使用 var 声明变量&#xff0c;编译期会通过初始化语句右侧的表达式推断出变量的类型。 // i is compiled as an int var i 5;// s is compiled as a string var s "Hello";// a is compiled as int[] var a new[] { 0, 1, 2 };// expr is co…

521源码网-免费网络教程-Cloudflare使用加速解析-优化大陆访问速度

Cloudfalre 加速解析是由 心有网络 向中国大陆用户提供的公共优化服务 接入服务节点: cf.13d7s.sit 接入使用方式类似于其它CDN的CNAME接入&#xff0c;可以为中国大陆用户访问Cloudflare网络节点大幅度加速&#xff0c;累计节点130 如何接入使用 Cloudflare 加速解析&#…

【机器学习300问】106、Inception网络结构如何设计的?这么设计的目的是什么?

谷歌的Inception网络&#xff0c;也被称为GoogLeNet&#xff0c;是Google在2014年推出的一种深度卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;在这之前的AlexNet、VGG等结构都是通过增大网络的深度&#xff08;层数&#xff09;来获得更好的训练效果&#xff0c;但…

阿里云 通过EIP实现VPC下的SNAT以及DNAT

192.168.0.85 有公网地址192.1680.95无公网地址 在192.168.0.85&#xff08;有公网地址服务器上操作&#xff09; #开启端口转发 echo "net.ipv4.ip_forward 1" >> /etc/sysctl.conf sysctl -p#仅允许192.168.0.95 iptables -t nat -I POSTROUTING -s 192.16…

【前缀和 记忆化搜索】LeetCode1444. 切披萨的方案数

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 记忆化搜索 LeetCode1444. 切披萨的方案数 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; ‘A’ &#xff…

GEYA格亚GRT8-S1S2间歇性双时间循环继电器时间可调交流220V 24v

品牌 GEYA 型号 GRT8-S2 AC/DC12-240V 产地 中国大陆 颜色分类 GRT8-S1 A220,GRT8-S1 AC/DC12-240V,GRT8-S2 A220,GRT8-S2 AC/DC12-240V GRT8-S&#xff0c;循环延时&#xff0c;时间继电器&#xff1a;LED指示灯&#xff0c;触头容量大&#xff0c;电压超宽&#xff0…

某咨询公司的大数据解决方案介绍(32页PPT)

方案介绍&#xff1a; 本咨询公司的大数据平台解决方案以企业实际需求为出发点&#xff0c;结合先进的大数据技术和行业经验&#xff0c;为企业提供一站式的大数据服务。通过实时数据收集与处理、深度数据分析与挖掘、可视化数据展示以及灵活的数据应用与扩展&#xff0c;帮助…

25. 悲观锁 和 乐观锁

文章目录 悲观锁 和 乐观锁1.基于CAS实现乐观锁2.自旋锁2.1.不可重入自旋锁2.2.可重入自旋锁2.3.CLH自旋锁 悲观锁 和 乐观锁 Java中的synchronized就是悲观锁的一个实现&#xff0c;悲观锁可以确保无论哪个线程持有锁&#xff0c;都能独占式的访问临界区代码&#xff0c;虽然悲…

企业微信hook接口协议,ipad协议http,获取欢迎语列表

获取欢迎语列表 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","offset":"","limit":10 } {"data": {&…

HTML静态网页成品作业(HTML+CSS)—— 冶金工程专业展望与介绍介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡&#xff0c;面对语言不通的窘境&#xff0c;即便是简单的对话也变得异常困难&#xff0c;真是挑战满满&#xff01; 然而&#xff0c;能离线翻译的软件让语言障碍不再是问题&#xff0c;不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包&#xff0c;选择…

信息系统项目管理师0604:项目整合管理 — 历年考题(详细分析与讲解)

点击查看专栏目录 1、2017年11月第34题 项目经理张工带领团队编制项目管理计划,(34)不属于编制项目管理计划过程的依据。 A. 项目章程B. 事业环境因素C. 组织过程资产D. 工作分解结构【答案】D 【解析】考查的是编写项目管理计划的相关知识,需要掌握。编写项目管理计划的…

HNU-深度学习-电商多模态图文检索

前言 主要是跟着baseline搭了一遍&#xff0c;没有想到很好的优化。 有官方教程&#xff0c;但是有点谬误&#xff0c;所以就想着自己记录一下我的完成过程。 github项目地址&#xff1a; https://github.com/OFA-Sys/Chinese-CLIP 官方文档&#xff1a; 电商多模态图文检…

Linux input输入子系统

Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;负责与具体的硬件设备进行交互&#xff0c;并将底层的硬件输入转化为统一的事件形式&#xff…

laravel项目配置Facades Redis自动补全,方法查看

问题原因: 因为Laravel的Redis连接实例是通过RedisManger的工厂类创建的,返回的是一个mixin的类型,因此在IDE中不能自动补全Redis的方法,缺少这个功能,使用起来有些麻烦,尤其是Redis有数十个方法,每个方法也有不少参数。 相关部分的代码如下: /*** @mixin \Illumina…