状态模式:其实就是在条件表达式过于复杂的时候,把状态的判断情况转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。
比如:现在有三个情况,在早上的时候工作状态比较好,下午要继续努力工作,晚上下班回家,就可以把这三个判断继承一个状态父类,分成三个子类去写,再用一个工作类维护初始的状态,这样在新加其他状态的时候,就不必去修改原来的类,实现了封闭-开发原则。
/**********************************************************************Work.h*************************************************************/
#ifndef WORK_H
#define WORK_H
class State;
class Work
{
State *state;
int Hour;
public:
Work();
void SetHour(int);
int GetHour();
void Handle();
};
#endif
/**********************************************************************Work.cpp*************************************************************/
#include "Work.h"
#include "StateA.h"
Work::Work()
{
state = new StateA;
}
void Work::SetHour(int hour)
{
Hour = hour;
}
int Work::GetHour()
{
return Hour;
}
void Work::Handle()
{
state->Handle(this);
}
/**********************************************************************State.h*************************************************************/
#ifndef STATE_H
#define STATE_H
#include <iostream>
class Work;
using namespace std;
class State
{
protected:
State * state;
public:
virtual void Handle(Work *) = 0;
};
#endif
/**********************************************************************StateA.h*************************************************************/
#ifndef STATEA_H
#define STATEA_H
#include "State.h"
#include "StateB.h"
#include "Work.h"
class StateA : public State
{
public:
void Handle(Work * work)
{
if(work->GetHour()<=12)
cout<<"早上工作状态很好"<<endl;
else
{
state = new StateB;
state->Handle(work);
}
};
};
#endif
/**********************************************************************StateB.h*************************************************************/
#ifndef STATEB_H
#define STATEB_H
#include "State.h"
#include "StateC.h"
#include "Work.h"
class StateB : public State
{
public:
void Handle(Work * work)
{
if(work->GetHour()>12 && work->GetHour() <17)
cout<<"下午继续努力工作"<<endl;
else
{
state = new StateC;
state->Handle(work);
}
};
};
#endif
/**********************************************************************StateC.h*************************************************************/
#ifndef STATEC_H
#define STATEC_H
#include "State.h"
class Work;
class StateC : public State
{
public:
void Handle(Work *work)
{
cout<<"下班回家咯"<<endl;
};
};
#endif
/**********************************************************************main.cpp*************************************************************/
#include "StateC.h"
#include "StateB.h"
#include "State.h"
#include "Work.h"
int main()
{
Work *work = new Work;
work->SetHour(10);
work->Handle();
work->SetHour(15);
work->Handle();
work->SetHour(18);
work->Handle();
getchar();
return 0;
}