简述
当一个对象内在状态改变时,允许改变其行为,这个对象看起来像改变了其类,单控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移,到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
场景说明
状态模式中,不同状态对象表现的也不同。就像变色龙一样,它随自己心情的变化会变成不同的颜色,它心情平静时为蓝色,心情兴奋时就变成了黄色
UML类图
当一个对象内在状态改变时,允许改变其行为,这个对象看起来像改变了其类,单控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移,到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
场景说明
状态模式中,不同状态对象表现的也不同。就像变色龙一样,它随自己心情的变化会变成不同的颜色,它心情平静时为蓝色,心情兴奋时就变成了黄色
UML类图
对象说明
State, 抽象的状态类
CalmState,具体实现的状态类一
ExcitementState,具体实现的状态类一
CalmState 维护一个当前状态,状态切换时该对象的表现也不同
实现
//抽象状态类
class State
{
public:
virtual void BodyColor() = 0;
};
class CalmState;
class ExcitementState;
//变色龙类
class Chameleon
{
public:
friend class CalmState;
friend class ExcitementState;
Chameleon()
{
mCurrState = NULL;
}
void ShowBodyColor()
{
if (mCurrState == NULL)
{
ShowBlue();
return;
}
mCurrState->BodyColor();
}
void SetState(State *currState)
{
mCurrState = currState;
}
private:
void ShowBlue()
{
std::cout << "变色龙变成蓝色" << std::endl;
}
void ShowYellow()
{
std::cout << "变色龙变成黄色" << std::endl;
}
State *mCurrState; //当前状态
};
//具体实现状态 心情平静状态
class CalmState :public State
{
public:
CalmState(Chameleon * chameleon)
{
mChameleon = chameleon;
}
void BodyColor()
{
std::cout << "变色龙心情平静" << std::endl;
mChameleon->ShowBlue();
}
private:
Chameleon * mChameleon;
};
//具体实现状态 心情兴奋状态
class ExcitementState :public State
{
public:
ExcitementState(Chameleon * chameleon)
{
mChameleon = chameleon;
}
void BodyColor()
{
std::cout << "变色龙心情兴奋" << std::endl;
mChameleon->ShowYellow();
}
private:
Chameleon * mChameleon;
};
int main()
{
Chameleon *chameleon = new Chameleon;
chameleon->ShowBodyColor();
ExcitementState *es = new ExcitementState(chameleon);
CalmState *cs = new CalmState(chameleon);
chameleon->SetState(es);
chameleon->ShowBodyColor();
chameleon->SetState(cs);
chameleon->ShowBodyColor();
return 0;
}