场景设定
我们需要设计一个 Hero(英雄)类,他有一个 Attack(攻击)的行为。
英雄可以使用'剑'攻击,也可以用'火球'攻击,甚至可以'空手'攻击。
1. 传统的做法(虚函数 + 继承)
在传统 OOP 中,如果不使用策略模式,你可能会觉得:既然攻击方式不同,那就派生出不同的子类吧。
// 基类
class Hero {
public:
virtual void Attack() {
cout << "空手攻击!" << endl;
}
};
// 派生类:剑士
class Swordsman : public Hero {
public:
void Attack() override {
cout << "挥剑斩击!" << endl;
}
};
// 派生类:法师
class Mage : public Hero {
public:
void Attack() override {
cout << "发射火球!" << endl;
}
};
这种写法的痛点:
- 死板:一旦你创建了一个
Swordsman对象,他就永远只能挥剑。如果他捡到一根魔杖想变成法师怎么办?你没法把一个Swordsman对象直接变成Mage对象。 - 类爆炸:如果你有 100 种武器,你难道要写 100 个
Hero的子类吗?
2. 新写法(std::function + 策略注入)
现在我们用你提到的方法。Hero 不再有子类,它只是一个'容器',它的 Attack 行为由一个 std::function 变量决定。
我们可以把这个变量理解为英雄装备的'技能卡槽'。
A. 定义 Hero 类
#
;
AttackStrategy = std::function<( Hero&)>;
{
std::cout << << std::endl;
}
{
:
(AttackStrategy strategy = DefaultPunch) : (strategy) {}
{
std::cout << << std::endl;
(*);
std::cout << << std::endl;
}
{
attack_skill = new_strategy;
}
:
AttackStrategy attack_skill;
};

