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

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


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

/**********************************************************************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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值