c++设计模式之状态模式
来源:互联网 发布:阿里云vps如何购买 编辑:程序博客网 时间:2024/05/16 06:29
- /************************************************************************/
- /* 状态模式 */
- /************************************************************************/
- #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();
- }
/************************************************************************//* 状态模式 *//************************************************************************/#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();}
- 设计模式之状态模式(c++)
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之--状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- c++设计模式之中介者模式
- c++设计模式之单例模式
- c++设计模式之组合模式
- c++设计模式之适配器模式
- 写给常熬夜的程序员朋友
- c++设计模式之状态模式
- 模板方法模式
- c++设计模式之抽象工厂模式
- c++设计模式之装饰者模式
- c++设计模式之原型模式Prototype
- symbolicatecrash 在什么位置
- 1到n中减少了一个数,顺序被打乱,找出缺失的数
- linux内核定时器
- xcode4.4符号化脚本