当前位置: 首页 > news >正文

《C++新经典设计模式》之第4章 策略模式

《C++新经典设计模式》之第4章 策略模式

        • 策略模式.cpp

策略模式.cpp
#include <iostream>
#include <memory>
using namespace std;// if或switch分支不稳定,经常改动时,考虑引入算法独立到策略类中去实现// 依赖倒置原则
// 高层组件不应该依赖于底层组件(具体实现类),两者都应该依赖于抽象层
// 面向接口(抽象层)编程,而不是针对实现(实现类)编程namespace ns0
{enum ItemAddlife // 增加补充生命值道具{LF_BXD, // 补血丹LF_DHD, // 大还丹LF_SHD, // 守护丹};class Fighter{protected:int m_life; // 人物生命值int m_magic;int m_attack;public:Fighter(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}virtual ~Fighter() {}public:void UseItem(ItemAddlife djtype) // 吃药补充生命值{switch (djtype) // 道具类型{case LF_BXD:       // 补血丹m_life += 200; // 补充200点生命值// if (主角中毒了)//{//     停止中毒状态,也就是主角吃药后就不再中毒// }// if (主角处于狂暴状态){m_life += 400;  // 额外再补充400点生命值m_magic += 200; // 魔法值也再补充200点}break;case LF_DHD:       // 大还丹m_life += 300; // 补充300点生命值break;case LF_SHD:       // 守护丹m_life += 500; // 补充500点生命break;}}};class F_Warrior : public Fighter // “战士”类{public:F_Warrior(int life, int magic, int attack) : Fighter(life, magic, attack) {}};class F_Mage : public Fighter // “法师”类{public:F_Mage(int life, int magic, int attack) : Fighter(life, magic, attack) {}};
}namespace ns1
{class Fighter;class ItemStrategy // 道具策略类的父类{public:virtual ~ItemStrategy() {}virtual void UseItem(Fighter *const mainobj) = 0;};// 战斗者父类class Fighter{shared_ptr<ItemStrategy> itemstrategy;protected:int m_life; // 人物生命值int m_magic;int m_attack;public:Fighter(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}virtual ~Fighter() {}public:void SetItemStrategy(const shared_ptr<ItemStrategy> &strategy) { itemstrategy = strategy; } // 设置道具使用的策略void UseItem() { itemstrategy->UseItem(this); }                                             // 使用道具(吃药)int GetLife() const { return m_life; }void SetLife(int life) { m_life = life; }};class F_Warrior : public Fighter // “战士”类{public:F_Warrior(int life, int magic, int attack) : Fighter(life, magic, attack) {}};class F_Mage : public Fighter // “法师”类{public:F_Mage(int life, int magic, int attack) : Fighter(life, magic, attack) {}};class ItemStrategy_BXD : public ItemStrategy // 补血丹策略类{public:void UseItem(Fighter *const mainobj) override { mainobj->SetLife(mainobj->GetLife() + 200); }};class ItemStrategy_DHD : public ItemStrategy // 大还丹策略类{public:void UseItem(Fighter *const mainobj) override { mainobj->SetLife(mainobj->GetLife() + 300); }};class ItemStrategy_SHD : public ItemStrategy // 守护丹策略类{public:void UseItem(Fighter *const mainobj) override { mainobj->SetLife(mainobj->GetLife() + 500); }};
}namespace ns2
{class M_Undead // 亡灵类怪物{public:void getinfo() const { cout << "M_Undead" << endl; }};class M_Element // 元素类怪物{public:void getinfo() const { cout << "M_Element" << endl; }};class M_Mechanic // 机械类怪物{public:void getinfo() const { cout << "M_Mechanic" << endl; }};class F_Warrior // 战士主角{public:void attack_enemy_undead(const shared_ptr<M_Undead> &pobj) // 攻击亡灵类怪物{pobj->getinfo(); // 可以调用亡灵类怪物相关的成员函数}public:void attack_enemy_element(const shared_ptr<M_Element> &pobj) // 攻击元素类怪物{pobj->getinfo(); // 可以调用元素类怪物相关的成员函数}};
}namespace ns3
{class Monster // 作为所有怪物类(抽象层){public:virtual ~Monster() {}virtual void getinfo() const = 0; // 纯虚函数};class M_Undead : public Monster // 亡灵类怪物{public:void getinfo() const override { cout << "M_Undead" << endl; }};class M_Element : public Monster // 元素类怪物{public:void getinfo() const override { cout << "M_Element" << endl; }};class M_Mechanic : public Monster // 机械类怪物{public:void getinfo() const override { cout << "M_Mechanic" << endl; }};class F_Warrior // 战士主角{public:void attack_enemy(const shared_ptr<Monster> &pobj) // 击杀怪物{pobj->getinfo(); // 可以调用怪物相关的成员函数}};
}int main()
{
#if 0using namespace ns0;shared_ptr<Fighter> prole_war(new F_Warrior(1000, 0, 200)); // 这没有采用工厂模式,如果主角很多,可以考虑采用工厂模式创建对象prole_war->UseItem(LF_DHD);
#endif#if 0using namespace ns1;// 创建主角shared_ptr<Fighter> prole_war(new F_Warrior(1000, 0, 200));// 吃一颗大还丹prole_war->SetItemStrategy(make_shared<ItemStrategy_DHD>()); // 主角设置大还丹策略,准备吃大还丹prole_war->UseItem();                                        // 主角吃大还丹// 再吃一颗补血丹shared_ptr<ItemStrategy> strateby2(new ItemStrategy_BXD()); // 创建补血丹策略prole_war->SetItemStrategy(strateby2);                      // 主角设置补血丹策略,准备吃补血丹prole_war->UseItem();                                       // 主角吃补血丹
#endif#if 0using namespace ns2;shared_ptr<F_Warrior> pobjwar(new F_Warrior());pobjwar->attack_enemy_undead(make_shared<M_Undead>()); // 攻击一只亡灵类怪物shared_ptr<M_Element> pobjelm(new M_Element());pobjwar->attack_enemy_element(pobjelm); // 攻击一只元素类怪物
#endif#if 1using namespace ns3;shared_ptr<F_Warrior> pobjwar(new F_Warrior());pobjwar->attack_enemy(make_shared<M_Undead>()); // 攻击一只亡灵类怪物shared_ptr<Monster> pobjelm(new M_Element());pobjwar->attack_enemy(pobjelm); // 攻击一只元素类怪物
#endifreturn 0;
}

相关文章:

《C++新经典设计模式》之第4章 策略模式

《C新经典设计模式》之第4章 策略模式 策略模式.cpp 策略模式.cpp #include <iostream> #include <memory> using namespace std;// if或switch分支不稳定&#xff0c;经常改动时&#xff0c;考虑引入算法独立到策略类中去实现// 依赖倒置原则 // 高层组件不应该依…...

【方法】PowerPoint“只读方式”如何取消?

PPT设置了以“只读方式”打开&#xff0c;可以保护文件无法编辑更改&#xff0c;那后续不需要保护了&#xff0c;或者想要编辑文件&#xff0c;要如何取消“只读方式”呢&#xff1f; 首先&#xff0c;我们要看看PPT设置的是哪种“只读方式”。 如果PPT设置的是无密码“只读方…...

MySQL数据库概念与实践

MySQL数据库概念与实践 1. 概念 MySQL是一种常用的关系型数据库管理系统&#xff0c;具有丰富的功能和广泛的应用。在本篇博客中&#xff0c;我们将介绍MySQL数据库的一些重要概念和相关知识。 存储引擎 存储引擎是MySQL数据库用于存储、更新和查询数据的技术实现方法。MyS…...

【ArcGIS Pro微课1000例】0052:基于SQL Server创建企业级地理数据库案例

文章目录 环境搭建创建企业级数据库连接企业级数据库环境搭建 ArcGIS:ArcGIS Pro 3.0.1Server.ecp:版本为10.7SQL Server:版本为SQL Server Developer 2019创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。工具位于:数据管理工具→地理数据库管理→创建企业…...

深度学习——第3章 Python程序设计语言(3.7 matplotlib库)

3.7 matplotlib库 目录 1 matplotlib库简介 2 pyplot的plot函数 3 matplotlib基础绘图函数示例 数据可视化有助于深度理解数据。 本节介绍绘制图形的基本方法。 1. matplotlib库简介 matplotlib官网 1.1 matplotlib库概述 matplotlib是Python优秀的数据可视化第三方库&a…...

【数据分析实战】酒店行业华住集团门店分布与评分多维度分析

文章目录 1. 写在前面2. 数据集展示3. 多维度分析3.1 门店档次多元化&#xff1a;集团投资战略观察3.1.1 代码实现3.1.2 本人浅薄理解 3.2 门店分布&#xff1a;各省市分布概览3.2.1 代码实现3.2.2 本人浅薄理解 3.3 门店分级评分&#xff1a;服务水平的多维度观察3.3.1 代码实…...

近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https,导致服务端302强制跳转到http也没反应

关于Chrome更新http强制跳转到https解决方法 近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https&#xff0c;导致服务端302强制跳转到http也没反应一、F12检查加载的Response Headers中有没有Non-Authoritative-Reason二、找了资料后得到解决方案&#xff1a;三、找…...

【scikit-learn基础】--『数据加载』之样本生成器

除了内置的数据集&#xff0c;scikit-learn还提供了随机样本的生成器。通过这些生成器函数&#xff0c;可以生成具有特定特性和分布的随机数据集&#xff0c;以帮助进行机器学习算法的研究、测试和比较。 目前&#xff0c;scikit-learn库&#xff08;v1.3.0版&#xff09;中有2…...

基于 ESP32-S3 的 Walter 开发板

Walter 是一款基于 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。 近日&#xff0c;比利时公司 DPTechnics BV 推出了一款基于乐鑫 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。该套件即将在 Crowd Supply 平台上发布&#xff0c;您可以点击此处了解详情。 无…...

Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…...

待做-待补充-每个节点做事,时间,以及与角度的关系

文章目录 纲领1.是否可以通过遍历一遍二叉树得到答案2.是否可以通过两颗子树相同问题的答案推导出树的答案(形式为递归)无论哪种思维模式&#xff0c;都需要思考:单独一个二叉树节点&#xff0c;它需要做什么事情&#xff1f;需要在什么时候做 后序判断问题是否和子树相关&…...

液态二氧化碳储存罐远程无线监测系统

二氧化碳强化石油开采技术&#xff0c;须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车&#xff0c;每辆罐车上有4台液态二氧化碳储罐&#xff0c;每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中&#xff0c;中控室S7-1…...

kafka学习笔记--安装部署、简单操作

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…...

UE4 材质实现Glitch效果

材质实现Glitch效果 UE4 材质实现Glitch效果预览1预览2 UE4 材质实现Glitch效果 预览1 添加材质函数&#xff1a; MF_RandomNoise 添加材质&#xff1a; 预览2 添加材质函数MF_CustomPanner&#xff1a; 添加材质函数&#xff1a;MF_Glitch 材质添加&#xff1a; 下面用…...

oracle实验2023-12-8--触发器

第十四周实验 【例】功能要求&#xff1a;增加一新表XS_1&#xff0c;表结构和表XS相同&#xff0c;用来存放从XS表中删除的记录。 分析: 1、创建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated题目&a…...

【Python百宝箱】贝叶斯统计的魅力:从PyMC3到ArviZ,探索数据背后的不确定性

标题&#xff1a;预测未来趋势的利器&#xff1a;深入贝叶斯统计和概率编程的世界 前言 贝叶斯统计和概率编程是一种强大的分析方法&#xff0c;可以帮助我们处理不确定性、建立灵活的模型以及进行参数估计和推断。本文将介绍几个常用的Python库&#xff0c;包括PyMC3、ArviZ…...

Knowledge Graph知识图谱—8. Web Ontology Language (OWL)

8. Web Ontology Language (OWL) 在RDFs不可能实现&#xff1a; Property cardinalities, Functional properties, Class disjointness, we cannot produce contradictions, circumvent the Non Unique Naming Assumption, circumvent the Open World Assumption 8.1 OWL Tr…...

排序算法——冒泡排序

排序算法是计算机科学中最基本的概念之一。在众多排序算法中&#xff0c;冒泡排序因其实现简单而被广泛学习。尽管它不是最高效的排序方法&#xff0c;但对于理解基本的排序概念非常有用。本文将深入探讨冒泡排序的原理、实现、优缺点以及应用场景。 1. 冒泡排序原理 冒泡排序…...

边缘智能网关如何应对环境污染难题

随着我国工业化、城镇化的深入推进&#xff0c;包括大气污染在内的环境污染防治压力继续加大。为应对环境污染防治难题&#xff0c;佰马综合边缘计算、物联网、智能感知等技术&#xff0c;基于边缘智能网关打造环境污染实时监测、预警及智能干预方案&#xff0c;可应用于大气保…...

uniapp定时器的应用

1、初始化定时器 data(){return{timer: null, //定时器} } 2、定时器的使用 定时器分两种&#xff0c;setInterval和setTimeout。 二者的区别&#xff1a; setInterval函数会无限执行下去&#xff0c;除非调用clearInterval函数来停止它。setTimeout函数只执行一次&#x…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...