狀態模式,當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來像是改變了其類。狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式對於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列當中,可以把複雜的判斷邏輯簡化。當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,就可以考慮使用狀態模式。
下面是狀態模式的結構圖:
下面是代碼:
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();
}
}
}
};
運行結果: