在策略模式中,定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换: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;
}