状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式通过把各种状态逻辑分布到state的子类之间,减少了相互间的依赖。
优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
目的:为了消除庞大的条件分支语句。
适用于:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。可以考虑状态模式。
代码:
#include <iostream>
using namespace std;
class Work;
class State
{
public:
virtual void WriteProgram(Work* w) = 0;
};
class ForenoonState : public State
{
public:
void WriteProgram(Work* w);
};
class NoonState : public State
{
public:
void WriteProgram(Work* w);
};
class AfternoonState : public State
{
public:
void WriteProgram(Work* w);
};
class EveningState : public State
{
public:
void WriteProgram(Work* w);
};
class SleepingState : public State
{
public:
void WriteProgram(Work* w);
};
class RestState : public State
{
public:
void WriteProgram(Work* w);
};
class Work
{
public:
Work()
{
current = new ForenoonState();
}
double getHour()
{
return hour;
}
void setHour(double value)
{
hour = value;
}
bool getTaskFinished()
{
return finish;
}
void setTaskFinished(bool value)
{
finish = value;
}
void SetState(State* s)
{
current = s;
}
void WriteProgram()
{
current->WriteProgram(this);
}
private:
State* current;
double hour;
bool finish = false;
};
void ForenoonState::WriteProgram(Work* w)
{
if(w->getHour() < 12)
{
cout << "当前时间:" << w->getHour() << "点 上午工作,精神百倍" << endl;
}
else
{
w->SetState(new NoonState());
w->WriteProgram();
}
}
void NoonState::WriteProgram(Work* w)
{
if(w->getHour() < 13)
{
cout << "当前时间:" << w->getHour() << "点 饿了,午饭;犯困,午休" << endl;
}
else
{
w->SetState(new AfternoonState());
w->WriteProgram();
}
}
void AfternoonState::WriteProgram(Work* w)
{
if(w->getHour() < 17)
{
cout << "当前时间:" << w->getHour() << "点 下午状态还不错,继续努力" << endl;
}
else
{
w->SetState(new EveningState());
w->WriteProgram();
}
}
void EveningState::WriteProgram(Work* w)
{
if(w->getTaskFinished())
{
w->SetState(new RestState());
w->WriteProgram();
}
else
{
if(w->getHour() < 21)
cout << "当前时间:" << w->getHour() <<"点 加班哦,疲累之极" << endl;
else
{
w->SetState(new SleepingState());
w->WriteProgram();
}
}
}
void SleepingState::WriteProgram(Work* w)
{
cout << "当前时间:" << w->getHour() << "点 不行了,睡着了" << endl;
}
void RestState::WriteProgram(Work* w)
{
cout << "当前时间:" << w->getHour() << "点 下班回家了" << endl;
}
int main()
{
Work* emergencyProjects = new Work();
emergencyProjects->setHour(9);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(10);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(12);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(13);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(14);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(17);
emergencyProjects->setTaskFinished(false);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(19);
emergencyProjects->WriteProgram();
emergencyProjects->setHour(22);
emergencyProjects->WriteProgram();
return 0;
}