您的位置:首页 > 编程语言 > C语言/C++

设计模式之状态模式(C++实现)

2016-06-17 13:46 435 查看
状态模式:其实就是在条件表达式过于复杂的时候,把状态的判断情况转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。

比如:现在有三个情况,在早上的时候工作状态比较好,下午要继续努力工作,晚上下班回家,就可以把这三个判断继承一个状态父类,分成三个子类去写,再用一个工作类维护初始的状态,这样在新加其他状态的时候,就不必去修改原来的类,实现了封闭-开发原则。

/**********************************************************************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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: