策略模式

在策略模式中,定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换:1、定义一组算法2、封装每个算法3、每组算法可互相替代

组成:—抽象策略角色:策略类,通常由一个接口或者抽象类实现。—具体策略角色:包装了相关的算法和行为。—环境角色:持有一个策略类的引用,最终给客户端调用

优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。

缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。

#pragma once
#include <iostream>
#include <string>
using namespace std;

// 想我这么喜欢玩游戏的人,我就以角色技能来说明吧。
// 角色有 一 到 多 个技能供玩家选择

// 策略角色
// 抽象的策略角色
// 技能
class FSkill
{
public:
	virtual void UseSkill() = 0;
};

// 具体的策略角色
class A : public FSkill
{
public:
	void UseSkill()
	{
		cout << "Skill A" << endl;
	}
};

class B : public FSkill
{
public:
	void UseSkill()
	{
		cout << "Skill B" << endl;
	}
};

class C : public FSkill
{
public:
	void UseSkill()
	{
		cout << "Skill C" << endl;
	}
};

class D : public FSkill
{
public:
	void UseSkill()
	{
		cout << "Skill D" << endl;
	}
};

// 环境角色
// 角色
class Character
{
protected:

	FSkill* Skill;

public:

	string Name = "";

	Character()
	{
		this->Skill = nullptr;
	}
	// 设置技能
	void SetSkill(FSkill* InSkill)
	{
		this->Skill = InSkill;
	}
	// 释放技能
	virtual void ReleaseSkill()
	{
		cout << "";
		this->Skill->UseSkill();
	};
};

// 法师
class Mage : public Character
{
public:
	
	void ReleaseSkill() override
	{
		cout << "My Is Mage :";
		this->Skill->UseSkill();
	};
};

// 射手
class Shooter : public Character
{
public:
	void ReleaseSkill() override
	{
		cout << "My Is Shooter :";
		this->Skill->UseSkill();
	};
};

// 战士
class Warrior : public Character
{
public:
	void ReleaseSkill() override
	{
		cout << "My Is Warrior :";
		this->Skill->UseSkill();
	};
};

// 辅助
class Assist : public Character
{
public:
	void ReleaseSkill() override
	{
		cout << "My Is Assist :";
		this->Skill->UseSkill();
	};
};

// 刺客
class Assassin :public Character
{
public:
	void ReleaseSkill() override
	{
		cout << "My Is Assassin :";
		this->Skill->UseSkill();
	};
};
int main()
{
	Character** Characters = new Character*[5];
	Characters[0] = new Mage();
	Characters[1] = new Shooter();
	Characters[2] = new Warrior();
	Characters[3] = new Assist();
	Characters[4] = new Assassin();

	FSkill** Skills = new FSkill*[4];
	Skills[0] = new A();
	Skills[1] = new B();
	Skills[2] = new C();
	Skills[3] = new D();

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			Characters[i]->SetSkill(Skills[j]);
			Characters[i]->ReleaseSkill();
		}
	}
}

运行结果:
在这里插入图片描述
补充小知识:

头文件里没有include <string> , string类型的变量是不能被 cout 输入的,须用 c_str()string 转化成 char*

#include <iostream>
using namespace std;
 
int main() {
	string str = "Hello World";
	//cout << str << endl; // 报错
	cout << str.c_str() << endl; // 正确
	return 0;
}
#include <iostream>
#include <string> // string头文件
using namespace std;
 
int main() {
	string str = "Hello World";
	cout << str << endl; // 正确
	return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值