状态模式:允许一个对象在其内部状态改变时改变它的行为。
对象看起来似乎修改了它的类。
它有两种使用情况:
(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
案例:英雄联盟杰斯切换形态攻击
#include <iostream>
using namespace std;
class Jayce;
class JayceState
{
public:
virtual void attack() = 0;
};
// 大炮形态
class CannonState : public JayceState
{
public:
CannonState(Jayce* state) : pCannon(state) {}
void attack()
{
cout << "当前处于大炮形态,不能使用锤子攻击" << endl;
}
private:
Jayce* pCannon;
};
// 锤子形态
class HammerState : public JayceState
{
public:
HammerState(Jayce* state) : pHammer(state) {}
void attack()
{
cout << "当前处于锤子形态,不能使用大炮攻击" << endl;
}
private:
Jayce* pHammer;
};
// 杰斯
class Jayce
{
public:
Jayce()
{
pCannon = new CannonState(this);
pHammer = new HammerState(this);
pJayce = pCannon;
}
~Jayce()
{
delete pCannon;
delete pHammer;
delete pJayce;
}
void use_cannon()
{
pJayce = pCannon;
}
void use_hammer()
{
pJayce = pHammer;
}
void attack()
{
pJayce->attack();
}
private:
CannonState* pCannon;
HammerState* pHammer;
JayceState* pJayce;
};
void test_01()
{
Jayce* jayce = new Jayce;
// 大炮形态
jayce->use_cannon();
jayce->attack();
// 锤子形态
jayce->use_hammer();
jayce->attack();
delete jayce;
}
int main()
{
test_01();
system("pause");
return 0;
}