c++设计模式之状态模式

来源:互联网 发布:阿里云系统软件下载 编辑:程序博客网 时间:2024/06/05 00:42
/************************************************************************//*                         状态模式                                     *//************************************************************************/#include <IOSTREAM>using namespace std;/*一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态如果程序写不完还得加班,即程序员的状态会随着时间发生改变*/class Work;/*状态接口State*/class State{public:virtual void WriteProgram(Work *w) = 0;//写程序的行为(与Work相关的行为)};//工作类class Work{private:State *current;//当前状态double hour;bool taskFinish;public:Work(){taskFinish = false;}void SetTime(double hour){this->hour = hour;}double GetTime(){return this->hour;}//设置状态void SetState(State *s){current = s;}//设置工程是否完成void SetFinish(){taskFinish = true;}bool GetFinish(){return taskFinish;}void WriteProgram(){current->WriteProgram(this);}};//下班休息状态class RestState : public State{public:void WriteProgram(Work *w){cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl;}};//睡眠工作状态class SleepingState : public State{public:void WriteProgram(Work *w){cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl;}};//晚上工作状态class EveningState : public State{public: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:void WriteProgram(Work *w){if(w->GetTime()<17){cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl;}else{w->SetState(new EveningState());w->WriteProgram();}}};//中午工作状态class NoonState : public State{public:void WriteProgram(Work *w){if (w->GetTime()<13)cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl;else{w->SetState(new AfternoonState());w->WriteProgram();}}};//上午工作状态class ForenoonState : public State{public: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();}


 

 

原创粉丝点击