#include "stdafx.h"
#include <IOSTREAM>
using namespace std;
class Work;
class State
{
public:
State(){};
virtual ~State(){};
virtual void WriteProgram(Work *w) = 0;
int getName(){
return m_name;
}
void setName(int name){
m_name = name;
}
private:
int m_name;
};
class Work
{
private:
State *current;//µ±Ç°×´Ì¬
State *s1;//µ±Ç°×´Ì¬
State *s2;//µ±Ç°×´Ì¬
State *s3;//µ±Ç°×´Ì¬
State *s4;//µ±Ç°×´Ì¬
State *s5;//µ±Ç°×´Ì¬
State *s6;//µ±Ç°×´Ì¬
double hour;
bool taskFinish;
public:
Work():s1(NULL),s2(NULL),s3(NULL),s4(NULL),s5(NULL),s6(NULL)
{
taskFinish = false;
}
~Work(){
if (s1)
{
delete s1;
s1 = NULL;
cout<<"delete s1"<<endl;
}
if (s2)
{
delete s2;
s2 = NULL;
cout<<"delete s2"<<endl;
}
if (s3)
{
delete s3;
s3 = NULL;
cout<<"delete s3"<<endl;
}
if (s4)
{
delete s4;
s4 = NULL;
cout<<"delete s4"<<endl;
}
if (s5)
{
delete s5;
s5 = NULL;
cout<<"delete s5"<<endl;
}
if (s6)
{
delete s6;
s6 = NULL;
cout<<"delete s6"<<endl;
}
//s2-s5,current
};
void SetTime(double hour)
{
this->hour = hour;
}
double GetTime()
{
return this->hour;
}
//ÉèÖÃ״̬
void SetState(State *s)
{
if (s->getName() == 1)
{
s1 = s;
}
else if (s->getName() == 2)
{
s2 = s;
}else if (s->getName() == 3)
{
s3 = s;
}else if (s->getName() == 4)
{
s4 = s;
}else if (s->getName() == 5)
{
s5 = s;
}else if (s->getName() == 6)
{
s6 = s;
}
current = s;
}
//ÉèÖù¤³ÌÊÇ·ñÍê³É
void SetFinish()
{
taskFinish = true;
}
bool GetFinish()
{
return taskFinish;
}
void WriteProgram()
{
if (current)
{
current->WriteProgram(this);
}
}
};
//Ï°àÐÝϢ״̬
class RestState : public State
{
public:
RestState(){
this->setName(1);
};
virtual ~RestState(){};
void WriteProgram(Work *w)
{
cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¹¤×÷Íê³É£¬Ï°à»Ø¼ÒÁË"<<endl;
}
};
//˯Ãß¹¤×÷״̬
class SleepingState : public State
{
public:
SleepingState(){
this->setName(2);
};
virtual ~SleepingState(){
};
void WriteProgram(Work *w)
{
cout<<"Êܲ»ÁËÁË,"<<w->GetTime()<<"µãÁË£¬ÏÈ˯°É"<<endl;
}
};
//ÍíÉϹ¤×÷״̬
class EveningState : public State
{
public:
EveningState(){
this->setName(3);
};
virtual ~EveningState(){
};
void WriteProgram(Work *w)
{
//ÈÎÎñÍê³ÉÁË£¬¿ÉÒÔÐÝÏ¢ÁË
if(w->GetFinish())
{
w->SetState(new RestState());
w->WriteProgram();
}else
{
if(w->GetTime()<21){
cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¼Ó°àÁË£¬Æ£±¹ÖÁ¼«"<<endl;
}else
{
//ÕÒ¹ý21µã
w->SetState(new SleepingState());
w->WriteProgram();
}
}
}
};
class AfternoonState : public State
{
public:
AfternoonState(){
this->setName(4);
};
virtual ~AfternoonState(){
};
void WriteProgram(Work *w)
{
if(w->GetTime()<17)
{
cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ״̬»¹²»´í£¬¼ÌÐøŬÁ¦"<<endl;
}else
{
w->SetState(new EveningState());
w->WriteProgram();
}
}
};
//ÖÐÎ繤×÷״̬
class NoonState : public State
{
public:
NoonState(){this->setName(5);};
virtual ~NoonState(){
};
void WriteProgram(Work *w)
{
if (w->GetTime()<13)
cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¶öÁË£¬Îç·¹:·¸À§£¬ÎçÐÝ"<<endl;
else
{
w->SetState(new AfternoonState());
w->WriteProgram();
}
}
};
//ÉÏÎ繤×÷״̬
class ForenoonState : public State
{
public:
ForenoonState(){
this->setName(6);
}
virtual ~ForenoonState(){};
void WriteProgram(Work *w)
{
if(w->GetTime()<12)
cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ÉÏÎ繤×÷£¬¾«Éñ°Ù±¶"<<endl;
else
{
w->SetState(new NoonState());
w->WriteProgram();
}
}
};
void main()
{
//½ô¼±ÏîÄ¿
Work *emergencyProjects = new Work();
emergencyProjects->SetState(new ForenoonState());
emergencyProjects->SetTime(9);
emergencyProjects->WriteProgram();
emergencyProjects->SetTime(10);
emergencyProjects->WriteProgram();
emergencyProjects->SetTime(12);
emergencyProjects->WriteProgram();
emergencyProjects->SetTime(14);
emergencyProjects->WriteProgram();
//Íê³É¹¤×÷£¬²»ÐèÒªÔÙ¼Ó°àÁË
//emergencyProjects->SetFinish();
emergencyProjects->SetTime(19);
emergencyProjects->WriteProgram();
emergencyProjects->SetTime(22);
emergencyProjects->WriteProgram();
if (emergencyProjects)
{
delete emergencyProjects;
emergencyProjects = NULL;
}
}
状态模式(State Pattern)是设计模式的一种,属于行为模式。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。