简述
当一个对象内在状态改变时,允许改变其行为,这个对象看起来像改变了其类,单控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移,到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
场景说明
状态模式中,不同状态对象表现的也不同。就像变色龙一样,它随自己心情的变化会变成不同的颜色,它心情平静时为蓝色,心情兴奋时就变成了黄色
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; }