设计模式---状态模式

xiaoxiao2021-02-28  83

状态模式 当一个对象的内在状态改变时允许改变其他行为,这个对象看起来像是改变了其类。 当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。

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; }
转载请注明原文地址: https://www.6miu.com/read-77839.html

最新回复(0)