C++策略模式:萧炎打架~

news2024/9/25 19:24:13

目录

    • 策略模式
    • 步骤
    • 例子:萧炎使用技能打架
      • 给出UML图
      • 1:定义技能策略
      • 2:实现技能策略
      • 3:定义萧炎类
      • 4:萧炎遇到强劲的敌人
      • 5:战斗过程

在这里插入图片描述

策略模式

策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户

步骤

1:定义策略接口:创建一个抽象基类或接口,定义所有支持的算法必须实现的方法。
2:实现具体策略:为每个算法创建具体的策略类,这些类实现第一步中定义的接口。
3:定义上下文环境:创建一个环境类,该类使用策略接口作为其成员变量,允许在运行时更改策略。
4:配置和使用:创建具体的策略对象和上下文对象,并将策略对象传递给上下文对象。

例子:萧炎使用技能打架

给出UML图

Implements
Implements
Implements
Implements
Implements
Implements
Implements
Uses
abstractSkillStrategy
+fight()
+virtual ~abstractSkillStrategy()
firstSkill
+fight()
secondSkill
+fight()
thirdSkill
+fight()
fourthSkill
+fight()
fifthSkill
+fight()
sixthSkill
+fight()
finalSkill
+fight()
xiaoYan
-abstractSkillStrategy* m_strategy
+fight(enemyLevel)
+~xiaoYan()

1:定义技能策略

class abstractSkillStrategy {
public:
	virtual void fight() = 0;
	virtual ~abstractSkillStrategy() { };
};

2:实现技能策略

class firstSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "吸掌~" << endl;
	}
};
class secondSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "吹火掌~" << endl;
	}
};
class thirdSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "八极崩~" << endl;
	}
};
class fourthSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "焰分噬浪尺~" << endl;
	}
};
class fifthSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "三千雷动~~三千雷幻身" << endl;
	}
};
class sixthSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "天火三玄变~" << endl;
		cout << "第一变:紫变~" << endl;
		cout << "第二变:琉璃变~" << endl;
		cout << "第三变:三千莲心火变~" << endl;
	}
};
class finalSkill :public abstractSkillStrategy {
public:
	void fight() {
		cout << "毁灭火莲~" << endl;
	}
};

3:定义萧炎类

enum class enemyLevel:char{First,Second,Third,Fourth,Fifth,Sixth,Final};
class xiaoYan {
public:
	void fight(enemyLevel level) {
		if (m_strategy) {
			delete m_strategy;
			m_strategy = nullptr;
		}
		switch (level) {
		case enemyLevel::First:
			m_strategy = new firstSkill;
			break;
		case enemyLevel::Second:
			m_strategy = new secondSkill;
			break;
		case enemyLevel::Third:
			m_strategy = new thirdSkill;
			break;
		case enemyLevel::Fourth:
			m_strategy = new fourthSkill;
			break;
		case enemyLevel::Fifth:
			m_strategy = new fifthSkill;
			break;
		case enemyLevel::Sixth:
			m_strategy = new sixthSkill;
			break;
		case enemyLevel::Final:
			m_strategy = new finalSkill;
			break;
		default:
			break;
		}
		m_strategy->fight();
	}
	~xiaoYan(){
		delete m_strategy;
	}
private:
	abstractSkillStrategy* m_strategy = nullptr;
};

4:萧炎遇到强劲的敌人

int main() {
	xiaoYan* xiaoyan = new xiaoYan;
	cout << "萧炎遇到了敌人~~" << endl;
	xiaoyan->fight(enemyLevel::First);
	cout << "敌人毫发无损:就这~" << endl;
	xiaoyan->fight(enemyLevel::Second);
	cout << "敌人后退一步:呵呵~" << endl;
	xiaoyan->fight(enemyLevel::Third);
	cout << "敌人头发被崩断一根:有点东西~小子" << endl;
	xiaoyan->fight(enemyLevel::Fourth);
	cout << "敌人使出技能格挡,后退10米:这就是你的全部实力了吗?" << endl;
	xiaoyan->fight(enemyLevel::Fifth);
	cout << "敌人摸不到:你是风雷阁的人?" << endl;
	cout << "敌人愤怒,使出变异功法提升实力~" << endl;
	xiaoyan->fight(enemyLevel::Sixth);
	cout << "敌人:拿命来~~~~" << endl;
	cout << "使用三千雷动疯狂躲闪~~" << endl;
	cout << "手搓火莲成功!!" << endl;
	xiaoyan->fight(enemyLevel::Final);
	cout << "敌人头接火莲~~额,后果你懂的!" << endl;
	return 0;
}

5:战斗过程

在这里插入图片描述

萧炎遇到了敌人~~
吸掌~
敌人毫发无损:就这~
吹火掌~
敌人后退一步:呵呵~
八极崩~
敌人头发被崩断一根:有点东西~小子
焰分噬浪尺~
敌人使出技能格挡,后退10米:这就是你的全部实力了吗?
三千雷动~~三千雷幻身
敌人摸不到:你是风雷阁的人?
敌人愤怒,使出变异功法提升实力~
天火三玄变~
第一变:紫变~
第二变:琉璃变~
第三变:三千莲心火变~
敌人:拿命来~~~~
使用三千雷动疯狂躲闪~~
手搓火莲成功!!
毁灭火莲~
敌人头接火莲~~额,后果你懂的!

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

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

相关文章

学姐说,WebGIS面试八股文不会也得背!会!

本文全是干货&#xff0c;内容来一线GIS开发工程师&#xff0c;目前是中地数码集团、新中地GIS开发特训营高级讲师&#xff0c;从事GIS软件开发工作8年&#xff0c;拥有丰富的软件开发和项目研发经验&#xff0c;对webGIS、桌面GIS开发有较深研究&#xff0c;深谙GIS开发面试的…

玩转单例模式

目录 1. 饿汉式 2. 懒汉式 3. volatile解决指令重排序 4. 反射破坏单例模式 5. 枚举实现单例模式 6. 枚举实现单例模式的好处 7.尝试反射破坏枚举 所谓单例模式&#xff0c;就是是某个类的实例对象只能被创建一次&#xff0c;单例模式两种实现&#xff1a;饿汉式和懒汉…

unity程序简易框架

1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …

直播预约|2024 乐鑫科技全球开发者大会亮点揭秘

时隔一年&#xff0c;2024 乐鑫科技全球开发者大会将在 9 月 3-5 日如约而至。这一年&#xff0c;人工智能给物联网领域带来了哪些变化&#xff1f;乐鑫在 AIoT 领域实现了哪些新突破&#xff1f;ESP-IDF 经过升级后增添了哪些新功能&#xff1f;ESP32-P4、ESP32-C6 迎来了怎样…

C语言指针详解-上

C语言指针详解-上 前言1.指针的基本概念1.1指针是什么1.2指针的声明与初始化1.3取地址符&和解引用符*& 运算符用于**获取变量的地址*** 运算符用于访问指针指向的值 2.指针的类型常见数据类型的指针指针与数组、字符串数组指针结构体指针函数指针二级指针void指针 3.指…

多级评论的实现,评论回复功能(两层型)

前言&#xff1a; 技术栈&#xff1a;springboot mysql mybatis 比着写一遍&#xff0c;你也一定会实现多级评论的功能&#xff0c;简单易上手&#xff01; 1.效果 整体的结构只有两层&#xff0c;但是确实现了评论回复功能 [ { "id": 2, "userId": …

让JMeter测试数据生成更容易

让JMeter测试数据生成更容易 背景&#xff1a; 在软件测试过程中&#xff0c;为了确保系统的稳定性和可靠性&#xff0c;需要对各种场景进行全面的测试。而不同的场景往往需要各种各样的测试数据&#xff0c;这些数据需要具有一定的真实性和多样性&#xff0c;以模拟实际使用…

零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功

本篇将介绍零基础小白实现C#调用halcon dll的过程&#xff0c;同时这其中涉及到很多知识&#xff0c;务必将HDevelop和VisualStudio安装成功。下面我将详细阐述C#调用halcon dll的过程&#xff0c;你的点赞和评论是我一直前行的动力。 1. C#调用Halcon DLL的过程 要在C#中调用…

选择TPM管理咨询公司,这几点是关键!

在这个日新月异的商业时代&#xff0c;企业的竞争力不仅体现在产品和服务上&#xff0c;更在于其内部管理的精细化与高效化。TPM作为提升企业综合生产效率的利器&#xff0c;正逐步成为众多企业转型升级的必然选择。然而&#xff0c;如何在众多TPM管理咨询公司中慧眼识珠&#…

嘉盛:股指、国债及商品期货分析

股指展望中证全指在2024年下半年可能迎来约20%的上涨空间。尽管市场估值较低&#xff0c;风险溢价仍维持在高位&#xff0c;这提升了指数的配置性价比。预计无风险利率将继续维持在较低水平&#xff0c;对中证全指估值产生积极影响。盈利方面&#xff0c;预计下半年中证全指EPS…

【广东】邀您共赴纷享销客生态伙伴大会

在数字化浪潮的驱动下&#xff0c;CRM行业正迎来前所未有的创新机遇。作为CRM领域的引领者&#xff0c;纷享销客特别举办“纷享销客2024生态伙伴大会&#xff08;广东站&#xff09;”。我们诚挚邀请各位生态伙伴莅临现场&#xff0c;共同探讨SaaS CRM行业的最新趋势&#xff0…

haproxy负载均衡+mysql读写分离

haproxy负载均衡 [roothaproxy01 ~]# yum -y install ntpdate [roothaproxy01 ~]# yum -y install ntp [roothaproxy01 ~]# systemctl start ntpd 安装haproxy [roothaproxy01 ~]# yum -y install ntpdate 配置文件的地址 [roothaproxy01 ~]# rpm -ql haproxy [roothap…

美摄科技携手蔚来汽车,共创用户出行新体验!

7月27日&#xff0c;蔚来举办了以 AI 为主线的 “NIO IN 2024 蔚来创新科技日”&#xff0c;此次活动展示了蔚来在智能电动汽车领域最新探索与成果&#xff0c;为中国乃至全球的智能汽车行业树立了新的标杆。当晚&#xff0c;央视《主播说联播》以“中国智能车在全球竞争的另一…

MIT6.s081 2021 Lab Multithreading

Uthread: switching between threads 思路 xv6 已经实现了进程的切换机制&#xff0c;本实验要求参考进程的切换&#xff0c;实现一个用户态线程的切换。 要实现线程切换&#xff0c;必然涉及上下文&#xff0c;即寄存器的保存和恢复&#xff0c;那么需要保存哪些寄存器&…

建筑工程项目管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

建筑工地安全检查

在现代化的建筑工地中&#xff0c;安全始终是至关重要的核心问题。随着科技的不断进步&#xff0c;凡尔码建筑工地安全系统应运而生&#xff0c;灵活根据施工现场管理要求搭建建筑工地安全系统各个模块&#xff0c;为施工安全带来了全新的保障。 如何注册建筑工地安全系统后台…

自动打电话软件给企业带来了什么?

使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的&#xff0c;想让自己的企业有所改变&#xff0c;有更好的发展&#xff0c;所以才会选择使用机器人外呼系统。而它也确实没让大家失望&#xff0c;使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…

鲁棒性目标检测 TOP2 方案分享

关联比赛: ACM MM2021 安全AI挑战者计划第七期&#xff1a;鲁棒性标识检测 ACM MM2021 鲁棒性目标检测比赛 TOP 2 方案 ​ 赛题背景 在商品知识产权领域&#xff0c;知识产权体现为在线商品的设计和品牌。不幸的是&#xff0c;在每一天&#xff0c;存在着非法商户通过一些…

一文学会本地部署可视化应用JSONCrack并配置公网地址实现远程协作

文章目录 前言1. Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 前言 本文主要介绍如何在Linux环境使用Docker安装数据可视化工具JSONCrack&#xff0c;并结合cpolar内网穿透工具实现团队在…

[Python学习日记-9] Python中的运算符

简介 计算机可以进行的运算有很多种&#xff0c;但可不只加减乘除这么简单&#xff0c;运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算&#xff0c;而本篇我们暂只介绍算数运算、比较运算、逻辑运算、赋值运算 算数运算 一、运算符描述…