/************************************************************************//* 状态模式 *//************************************************************************/#includeusing 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<<"当前时间:"< GetTime()<<"点 工作完成,下班回家了"< GetTime()<<"点了,先睡吧"< GetFinish()) { w->SetState(new RestState()); w->WriteProgram(); }else { if(w->GetTime()<21){ cout<<"当前时间:"< GetTime()<<"点 加班了,疲惫至极"< SetState(new SleepingState()); w->WriteProgram(); } } } };//下午工作状态class AfternoonState : public State{ public: void WriteProgram(Work *w) { if(w->GetTime()<17) { cout<<"当前时间:"< GetTime()<<"点 状态还不错,继续努力"< SetState(new EveningState()); w->WriteProgram(); } }};//中午工作状态class NoonState : public State{public: void WriteProgram(Work *w) { if (w->GetTime()<13) cout<<"当前时间:"< GetTime()<<"点 饿了,午饭:犯困,午休"< SetState(new AfternoonState()); w->WriteProgram(); } } };//上午工作状态class ForenoonState : public State{public: void WriteProgram(Work *w) { if(w->GetTime()<12) cout<<"当前时间:"< GetTime()<<"点 上午工作,精神百倍"< 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();}