状态模式
状态模式简介意图适用性举例UML设计代码示例思考
简介
状态模式类似于通过将行为进行类抽象,当用户改变状态变量时,实现不同行为对象的调用。
意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性
-
一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
-
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
举例
一个工人一天的时间分为上班、睡觉、干其他事情三个时间段。我们可以用状态模式来标示一天中在干什么事情。
UML设计
代码示例
class State; class Worker{ public: Worker(); void setTime(int time); int getTime(); void requestDoing(); protected: friend class State; void ChangeState(State* state); private: State* m_state; int m_time; } class State{ public: static State* StateInstance() = 0; void doing(Worker*); } class WorkState:public State{ static State* StateInstance(){……} void doing(Worker*); } class SleepState:public State{ static State* StateInstance(); void doing(Worker*); } class OtherState:public State{ static State* StateInstance(); void doing(Worker*); } Worker::Worker(){ m_state = new WorkerState(); } void Worker::setTime(int time){ m_time = time; } void Worker::requestDoing(){ m_state.doing(this); } void WorkState::doing(Worker* worker){ if(worker->getTime > 8 && worker->getTime() < 16){ cout<<"working."; }else{ worker->ChangeState(OtherState::StateInstance()); } } void SleepState::doing(Worker* worker){ …… } void OtherState::doing(Worker* worker){ …… }
思考
-
状态模式是为了摆脱多条件判断而产生的一种设计方法,而通过上面的代码仅仅是将条件判断的场合进行了转移,并没有提供代码的简洁性。
-
通过单例方法虽然能过解决对状态的new和delete的重复使用,但无法解决面对多工作者时状态行为的不一致性。