现实需求:应用程序中的有些对象可能会根据不同的情况做出不同的行为,这种对象称为有状态的对象,而影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。
状态模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
核心思想:当控制一个对象状态转换的条件表达式过于复杂时,把相关“判断逻辑”提取出来,放到一系列的状态类当中,这样可以把原来复杂的逻辑判断简单化。
优点:
缺点:
主要角色:
案例:
小码路一周的生活方式就是上班,睡觉,吃饭,这种生活呀,小码路日复一日,于是用状态模式记录下自己的一天生活。
第一步:抽象状态
#include <iostream>
using namespace std;
//前置声明
class Xml;
//状态类
class State
{
public:
virtual void day(Xml* xml)=0;
};
第二步:具体状态
//上班状态类
class WorkState:public State
{
public:
void day(Xml* xml);
};
//睡觉状态
class SleepState:public State
{
public:
void day(Xml* xml);
};
//吃饭状态
class EatState:public State
{
public:
void day(Xml* xml);
};
第三步:客户角色
//小码路
class Xml
{
public:
Xml(){
state =new WorkState();
}
void setState(State* stat)
{
state=stat;
}
double getHour()
{
return hour;
}
void setHour(double hou)
{
hour=hou;
}
void requestday()
{
state->day(this);
}
private:
State* state;
double hour;
};
第四步:状态方法实现
//各个状态的方法实现
void WorkState::day(Xml* xml)
{
if(xml->getHour() > 9 && xml->getHour()<22)
cout<<"小码路在上班呀!"<<endl;
else
{
xml->setState(new EatState());
xml->requestday();
}
}
void SleepState::day(Xml* xml)
{
if(xml->getHour() >= 23 || xml->getHour()<6)
cout<<"小码路在睡觉呀!"<<endl;
else
{
xml->setState(new EatState());
xml->requestday();
}
}
void EatState::day(Xml* xml)
{
if(xml->getHour() > 6 && xml->getHour()<9)
cout<<"小码路在吃饭呀!"<<endl;
else if(xml->getHour() >= 23 || xml->getHour()<6)
{
xml->setState(new SleepState());
xml->requestday();
}
else
{
xml->setState(new WorkState());
xml->requestday();
}
}
第五步:客户实现
int main()
{
Xml *xml=new Xml();
xml->setHour(12);
cout<<"12点的时候: ";
xml->requestday();
xml->setHour(7);
cout<<"7点的时候: ";
xml->requestday();
xml->setHour(24);
cout<<"24点的时候: ";
xml->requestday();
delete xml;
}
显示: