using namespace std;
class Work; class State { public: virtual void WriteProgram(Work *w){} }; class NoonState; class ForenoonState:public State { public: void WriteProgram(Work *w); }; class AfterState; class NoonState:public State { public: void WriteProgram(Work *w); }; class EveningState; class AfterState:public State { public: void WriteProgram(Work *w); }; class SleepingState; class ResetState; class EveningState:public State { public: void WriteProgram(Work *w); }; class SleepingState:public State { public: void WriteProgram(Work *w); }; class ResetState:public State { public: void WriteProgram(Work *w); }; class Work { private: State *cur; double hour; bool finish; public: Work(); void SetHour(double hour) { this->hour = hour; } double GetHour() { return hour; } void SetTaskFinished(bool finished) { this->finish = finished; } bool GetTaskFinished() { return finish; } void SetState(State *s) { cur = s; } void WriteProgram() { cur->WriteProgram(this); } }; void ForenoonState::WriteProgram(Work *w) { if(w->GetHour() < 12) { cout<<" morning happy ..."<<w->GetHour()<<endl; } else { w->SetState(new NoonState()); w->WriteProgram(); } } void NoonState::WriteProgram(Work *w) { if(w->GetHour() < 13) { cout<<" noon slepping ..."<<w->GetHour()<<endl; } else { w->SetState(new AfterState()); w->WriteProgram(); } } void AfterState::WriteProgram(Work *w) { if(w->GetHour() < 17) { cout<<" after ok ..."<<w->GetHour()<<endl; } else { w->SetState(new EveningState()); w->WriteProgram(); } } void EveningState::WriteProgram(Work *w) { if(w->GetTaskFinished() ) { w->SetState(new ResetState()); w->WriteProgram(); } else { if(w->GetHour() < 21) { cout<<" overtime ..."<<w->GetHour()<<endl; } else { w->SetState(new SleepingState()); w->WriteProgram(); } } } void SleepingState::WriteProgram(Work *w) { cout<<" sleeping time ..."<<w->GetHour()<<endl; } void ResetState:: WriteProgram(Work *w) { cout<<" go home ..."<<w->GetHour()<<endl; } Work::Work() { cur = new ForenoonState(); } int main() { Work *empro = new Work(); empro->SetHour(9); empro->WriteProgram(); empro->SetHour(10); empro->WriteProgram(); empro->SetHour(12); empro->WriteProgram(); empro->SetHour(13); empro->WriteProgram(); empro->SetHour(14); empro->WriteProgram(); empro->SetHour(17); empro->SetTaskFinished(false); empro->WriteProgram(); empro->SetHour(19); empro->WriteProgram(); empro->SetHour(22); empro->WriteProgram(); return 0; }