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


在这里插入图片描述

策略模式

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

步骤

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米:这就是你的全部实力了吗?
三千雷动~~三千雷幻身
敌人摸不到:你是风雷阁的人?
敌人愤怒,使出变异功法提升实力~
天火三玄变~
第一变:紫变~
第二变:琉璃变~
第三变:三千莲心火变~
敌人:拿命来~~~~
使用三千雷动疯狂躲闪~~
手搓火莲成功!!
毁灭火莲~
敌人头接火莲~~额,后果你懂的!
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值