定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不
同状态的一系列类中,可以把复杂的判断逻辑简化。
状态模式的结构图如下:
状态模式的适用场合:
(1) 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
(2) 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
下面是编写的一段代码,应用了状态模式的方法,更好地领悟了状态模式:
#include <iostream>
using namespace std ;
class Work ; //声明
class Forenoon ;
class Noon ;
class Afternoon ;
class Evening ;
class GoHome ;
class State ;
class State //状态类
{
public:
virtual void WriteProgram(Work * pWork) = 0 ; //当前状态纯虚函数
};
class Work //工作类
{
State * pPresent ; //当前状态的指针
public:
double dblHours ; //时间
bool bFinish ; //任务完成情况
Work() ;
void Setstate(State* pState) //设置当前状态
{
pPresent = pState ;
}
void WorkProgram() //查看当前状态
{
pPresent->WriteProgram(this) ;
}
};
class Forenoon : public State //上午
{
public:
void WriteProgram(Work * pWork) ;
};
class Noon : public State //中午
{
public:
void WriteProgram(Work * pWork) ;
};
class Afternoon : public State //下午
{
public:
void WriteProgram(Work * pWork) ;
};
class Evening : public State //晚上
{
public:
void WriteProgram(Work * pWork) ;
};
class GoHome : public State //下班回家
{
public:
void WriteProgram(Work * pWork)
{
cout<<"当前时间为:" << pWork->dblHours<<"点 下班回家"<<endl ;
}
};
Work::Work()
{
bFinish = 0 ;
pPresent = new Forenoon() ; //初始化为上午
}
void Forenoon:: WriteProgram(Work * pWork)
{
if(pWork->dblHours<11)
{
cout<<"当前时间为:" << pWork->dblHours<<"点 上午工作,精神百倍"<<endl ;
}
else
{
pWork->Setstate(new Noon()) ; //超过12点则变为中午
pWork->WorkProgram() ;
}
}
void Noon:: WriteProgram(Work * pWork)
{
if(pWork->dblHours<13)
{
cout<<"当前时间为:" << pWork->dblHours<<"点 吃午饭,休息,精神百倍"<<endl ;
}
else
{
pWork->Setstate(new Afternoon()) ; //超过13点则变为下午
pWork->WorkProgram() ;
}
}
void Afternoon:: WriteProgram(Work * pWork)
{
if(pWork->dblHours<17)
{
cout<<"当前时间为:" << pWork->dblHours<<"点 下午工作还行"<<endl ;
}
else
{
pWork->Setstate(new Evening()) ; //超过17点则变为晚上
pWork->WorkProgram() ;
}
}
void Evening:: WriteProgram(Work * pWork)
{
if(pWork->bFinish)
{
pWork->Setstate(new GoHome()) ; //超过17点则变为晚上
pWork->WorkProgram() ;
}
else
{
cout<<"当前时间为:" << pWork->dblHours<<"点 在加班,好辛苦"<<endl ;
}
}
int main()
{
Work * pWork = new Work() ;
pWork->dblHours = 10 ;
pWork->WorkProgram() ;
pWork->dblHours = 12 ;
pWork->WorkProgram() ;
pWork->dblHours = 16;
pWork->WorkProgram() ;
pWork->dblHours = 19 ;
pWork->bFinish = 0 ;
pWork->WorkProgram() ;
pWork->dblHours = 20 ;
pWork->bFinish = 1 ;
pWork->WorkProgram() ;
return 0 ;
}
运行程序后的结果为: