状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一些列类当中,可以把复杂的判断逻辑简化。
好处:将与特定状态相关的行为局部化,并且将不同状态的行为分离开来,将特定的状态相关的行为放入一个对象中,通过定义新的子类可以很容易的增加新的状态和转换。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
实例代码如下:
#include <iostream>
using namespace std;
class Work;
class State
{
public:
virtual void WriteProgram(Work *w)=0;
};
class ForenoonState:public State
{
public:
void WriteProgram(Work *w);
};
class NoonState:public State
{
public:
void WriteProgram(Work *w);
};
class AfternoonState:public State
{
public:
void WriteProgram(Work *w);
};
class EveningState:public State
{
public:
void WriteProgram(Work *w);
};
class Work
{
private:
State *m_CurrentState;
int m_Hour;
public:
Work()
{
m_CurrentState=new ForenoonState;
}
~Work()
{
delete m_CurrentState;
}
void SetHour(int hour)
{
m_Hour=hour;
}
int GetHour(void)
{
return m_Hour;
}
void SetState(State *state)
{
delete m_CurrentState;
m_CurrentState=state;
}
void WriteProgram()
{
m_CurrentState->WriteProgram(this);
}
};
void ForenoonState::WriteProgram(Work *w)
{
if (w->GetHour()<12)
{
cout<<"现在时刻:"<<w->GetHour()<<"上午工作,精神很好"<<endl;
}
else
{
w->SetState(new NoonState);
w->WriteProgram();
}
}
void NoonState::WriteProgram(Work *w)
{
if (w->GetHour()<13)
{
cout<<"现在时刻:"<<w->GetHour()<<"中午吃饭"<<endl;
}
else
{
w->SetState(new AfternoonState);
w->WriteProgram();
}
}
void AfternoonState::WriteProgram(Work *w)
{
if (w->GetHour()<18)
{
cout<<"现在时刻:"<<w->GetHour()<<"下午工作,精神一般"<<endl;
}
else
{
w->SetState(new EveningState);
w->WriteProgram();
}
}
void EveningState::WriteProgram(Work *w)
{
cout<<"晚上下班回家"<<endl;
}
void main()
{
Work w;
w.SetHour(8);
w.WriteProgram();
w.SetHour(9);
w.WriteProgram();
w.SetHour(12);
w.WriteProgram();
w.SetHour(13);
w.WriteProgram();
w.SetHour(18);
w.WriteProgram();
}
这个程序中定义了工作Work的四种状态,ForenoonState、NoonState、AfternoonState、EveningState,这四种状态都为Wrok提供了行为WriteProgram,不同状态下行为WriteProgram也不同。