2011年4月1日 星期五 〖农历 辛卯 免年 二月廿八〗 晴
设计模式之(十二、状态模式State)
适用范围:
当一个对象的内存状态改变时允许改变其行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
以书中关于上班时间的工作状态为实例来介绍该模式。
状态模式结构图如下所示:
C++关键代码实现:
1、状态接口类IState
IState.h
class Work;//声明需要使用的类
virtual void WriteProram(Work *w) = 0;//虚函数
2、具体的状态类:上午状态类CForenoonState
CForenoonState.cpp
void CForenoonState::WriteProgram(Work *w)
{
if(w->GetHour() < 12)
{
cout<<"现在时间是:"<<w->GetHour()<<"点,工作中,状态很好!"<<endl;
}
else
{
IState *s = new CNoonState();
w->SetState(s);
w->WriteProgram();
if( s != NULL)
{
delete s;
}
}
}
3、中午状态类CNoonState
CNoonState.cpp
void CNoonState::WriteProgram(Work *w)
{
if(w->GetHour() < 13 )
{
cout<<"现在时间是:"<<w->GetHour()<<"点,休息中!"<<endl;
}
else
{
IState *s = new CAfternoonState();
w->SetState(s);
w->WriteProgram();
if (s != NULL)
{
delete s;
}
}
}
4、下午状态类CAfternoonState
CAfternoonState.cpp
void CAfternoonState::WriteProgram(Work *w)
{
if(w->GetHour() < 17)
{
cout<<"现在时间是:"<<w->GetHour()<<"点,工作状态不错!"<<endl;
}
else
{
IState *s = new CEveningState();
w->SetState(s);
w->WriteProgram();
if (s != NULL)
{
delete s;
}
}
}
5、傍晚状态类CEveningState
CEveningState.cpp
void CEveningState::WriteProgram(Work *w)
{
if (w->GetRestFlag())
{
IState *s = new CRestState();
w->SetState(s);
w->WriteProgram();
if (s != NULL)
{
delete s;
}
}
else
{
if (w->GetHour()<21)
{
cout<<""<<w->GetHour()<<""<<endl;
}
else
{
IState *s = new CSleepState();
w->SetState(s);
w->WriteProgram();
if(s != NULL)
{
delete s;
}
}
}
}
6、休息状态类CRestState
CRestState.cpp
void CRestState::WriteProgram(Work *w)
{
cout<<"现在时间是:"<<w->GetHour()<<"点,好累!"<<endl;
}
7、睡眠状态类CSleepState
CSleepState.cpp
void CSleepState::WriteProgram(Work *w)
{
cout<<"现在时间是:"<<w->GetHour()<<"点,好困呀!"<<endl;
}
8、工作类Work
Work.cpp
Work::Work():m_state(NULL)
{
}
Work::~Work()
{
}
//可以不用
void Work::SetState(IState *s)
{
m_state = s;
}
void Work::SetHour(double d)
{
m_hour = d;
}
double Work::GetHour()
{
return m_hour;
}
void Work::SetRestFlag(bool falg)
{
m_restflag = flag;
}
bool Work::GetRestFlag()
{
return m_restflag;
}
void Work::WriteProgram()
{
m_state->WriteProgram(this);
}
9、客户端实现main.cpp
Work *w = new Work();
IState *s = new CForenoonState();
w->SetState(s);
w->SetRestFlag(true);
w->SetHour(11);
w->WriteProgram();
w->SetHour(12.1);
w->SetState(s);
w->WriteProgram();
w->SetHour(15);
w->SetState(s);
w->WriteProgram();
w->SetHour(19);
w->SetState(s);
w->WriteProgram();
w->SetRestFlag(false);
w->SetHour(20);
w->SetState(s);
w->WriteProgram();
w->SetHour(22);
w->SetState(s);
w->WriteProgram();
if( w != NULL )
{
delete w;
}
if(s != NULL)
{
delete s;
}
以上,仅供参考。