学习笔记:策略模式
模式简介
:属于行为型模式,一个类的算法可以在运行时更改。
为什么用
:避免使用if-else语句选择不同的算法。
怎么样用
:写个策略的父类,子类实现不同的策略,其他的类可以通过策略子类调用不同的策略方法。
注意事项
:策略过多使用混合模式。
实际举例
:战斗系统的实现
#include <iostream>
using namespace std;
//人物
class Person {
private:
string name;
public:
Person(string name) {
this->name = name;
}
string getName() {
return "[" + name + "]";
}
};
class Attack {
public:
virtual void toDo(Person*p1,Person*p2) {
cout << "待实现的方法\n";
}
};
class Attack_Skill :public Attack {
public:
void toDo(Person* p1, Person* p2) {
//具体的技能效果DIY
cout << p1->getName() << "使用技能攻击了" << p2->getName() << "\n";
}
};
class Attack_General :public Attack {
public:
void toDo(Person* p1, Person* p2) {
//具体的技能效果DIY
cout << p1->getName() << "攻击了" << p2->getName() << "\n";
}
};
class AttackManager {
private:
Person* p1;
Person* p2;
Attack_Skill* attack_skill;
Attack_General* attack_general;
public:
AttackManager(Person*p1,Person*p2) {
this->p1 = p1;
this->p2 = p2;
attack_skill = new Attack_Skill();
attack_general = new Attack_General();
}
//不同策略
void toDo(Person*p1,Person*p2,Attack * attack) {
attack->toDo(p1,p2);
}
//攻击方式和次数由相应参数决定
void play() {
toDo(p1,p2, attack_general);
toDo(p1,p2, attack_skill);
toDo(p1, p2, attack_general);
toDo(p2, p1, attack_general);
toDo(p2, p1, attack_general);
}
};
int main() {
Person* p1 = new Person("moota");
Person* p2 = new Person("vicky");
AttackManager* attackManager = new AttackManager(p1,p2);
attackManager->play();
return 0;
}