C++状态模式的用法

来源:互联网 发布:智能排班软件app 编辑:程序博客网 时间:2024/06/14 19:44

C++状态模式的用法,实际上就是运用C++的多态性去实现的,还有面向对象

#include "stdafx.h"#include<iostream>  #include<string>  using namespace std;  ///************************************************************************///*                         状态模式                                     *///************************************************************************//*一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态如果程序写不完还得加班,即程序员的状态会随着时间发生改变*/class Work;  //一定要声明有这个类,下面有用到//*状态接口State*/class State{public://写程序的行为(与Work相关的行为)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<<endl;}};//睡眠工作状态class SleepingState : public State  //继承{public:void WriteProgram(Work *w){cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl<<endl;}};//晚上工作状态class EveningState : public State   //继承{public:void WriteProgram(Work *w){//任务完成了,可以休息了if(w->GetFinish()){//void SetState(State *s) //State *s = new RestState(); w->SetState(new RestState());w->WriteProgram();}else{if(w->GetTime()<21){cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl<<endl;}else{//找过21点//void SetState(State *s) //State *s = new SleepingState(); w->SetState(new SleepingState());w->WriteProgram();}}}};//下午工作状态class AfternoonState : public State{public:void WriteProgram(Work *w){if(w->GetTime()<17){cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl<<endl;}else{//void SetState(State *s) //State *s = new EveningState();w->SetState(new EveningState());w->WriteProgram();}}};//中午工作状态class NoonState : public State{public:void WriteProgram(Work *w){if (w->GetTime()<13)cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl<<endl;else{//void SetState(State *s) //State *s = new AfternoonState();w->SetState(new AfternoonState());w->WriteProgram();}}};//上午工作状态class ForenoonState : public State{public:void WriteProgram(Work *w){if(w->GetTime()<12)cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl<<endl;else{//void SetState(State *s) //State *s = new NoonState();w->SetState(new NoonState());w->WriteProgram();}}};void main(){//紧急项目Work *emergencyProjects = new Work();//void SetState(State *s) //State *s = new ForenoonState();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();system("pause");}

0 0
原创粉丝点击