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