状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式对于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列当中,可以把复杂的判断逻辑简化。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
下面是状态模式的结构图:
下面是代码:
class Work;
class State
{
public:
State() {}
virtual ~State() {}
virtual void WriteProgram(Work* __w) = 0;
};
class Work
{
private:
State *m_pState;
int m_iHour;
bool m_bTaskFinished;
public:
Work( State* __s )
{
m_bTaskFinished = false;
m_iHour = 8;
m_pState = __s;
}
~Work()
{
if (m_pState)
{
delete m_pState;
m_pState = NULL;
}
}
int GetHour()
{
return m_iHour;
}
void SetHour( int __h)
{
m_iHour = __h;
}
bool GetTaskFinished()
{
return m_bTaskFinished;
}
void SetTaskFinished(bool __t)
{
m_bTaskFinished = __t;
}
void SetState(State* __s)
{
if (m_pState != NULL)
{
delete m_pState;
m_pState = NULL;
}
m_pState = __s;
}
void Request()
{
m_pState->WriteProgram( this );
}
};
class ForenoonState : public State
{
public:
ForenoonState() {}
~ForenoonState() {}
virtual void WriteProgram( Work* __w)
{
if (__w->GetHour() < 12)
{
printf("当前时间:%d点 上午工作,精神百倍\n", __w->GetHour());
}
else
{
__w->SetState( new NoonState());
__w->Request();
}
}
};
class NoonState : public State
{
public:
NoonState() {}
~NoonState() {}
virtual void WriteProgram(Work* __w)
{
if (__w->GetHour() < 13)
{
printf("当前时间:%d点 饿了,午饭;犯困,午休\n", __w->GetHour());
}
else
{
__w->SetState(new AfternoonState());
__w->Request();
}
}
};
class AfternoonState : public State
{
public:
AfternoonState() {}
~AfternoonState() {}
virtual void WriteProgram(Work* __w)
{
if (__w->GetHour() < 17)
{
printf("当前时间:%d点 下午状态还不错,继续努力\n", __w->GetHour());
}
else
{
__w->SetState(new EveningState());
__w->Request();
}
}
};
class EveningState : public State
{
public:
EveningState() {}
~EveningState() {}
virtual void WriteProgram(Work* __w)
{
if (__w->GetTaskFinished())
{
__w->SetState(new RestState());
__w->Request();
}
else
{
if (__w->GetHour() < 21 )
{
printf("当前时间:%d点 加班哦,疲累之极\n", __w->GetHour());
}
else
{
__w->SetState(new SleepingState());
__w->Request();
}
}
}
};
运行结果: