C++状态模式的用法

C++状态模式的用法,实际上就是运用C++的多态性去实现的,还有面向对象

#include "stdafx.h"
#include<iostream>  
#include<string>  
using namespace std;  



///************************************************************************/
//*                         状态模式                                     */
//************************************************************************/





/*	一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态
	时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合



	这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态
	如果程序写不完还得加班,即程序员的状态会随着时间发生改变
*/
class Work;  //一定要声明有这个类,下面有用到

//*状态接口State*/
class State
{
public:
	//写程序的行为(与Work相关的行为)
	virtual void WriteProgram(Work *w) = 0;//这里传入了一个Work指针
};



//工作类
class Work
{
private:
	State *current;//当前状态,是纯虚类
	double hour;
	bool taskFinish;
	
	
public:
	Work()         //构造函数
	{
		taskFinish = false;
	}


	void SetTime(double hour)
	{
		this->hour = hour;
	}


	double GetTime()
	{
		return this->hour;
	}
	
	//设置状态
	void SetState(State *s)
	{
		current = s;
	}
	
	//设置工程是否完成
	void SetFinish()
	{
		taskFinish = true;
	}



	bool GetFinish()
	{
		return taskFinish;
	}
	
	
	void WriteProgram()
	{
		current->WriteProgram(this);
	}
	
};






//下班休息状态
class RestState : public State  //继承
{
public:
	void WriteProgram(Work *w)
	{
		cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl<<endl;
	}
	
};




//睡眠工作状态
class SleepingState : public State  //继承
{
public:
	void WriteProgram(Work *w)
	{
		cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl<<endl;
	}
	
};



//晚上工作状态
class EveningState : public State   //继承
{
public:
	void WriteProgram(Work *w)
	{
		//任务完成了,可以休息了
		if(w->GetFinish())
		{
			//void SetState(State *s) //State *s = new RestState(); 
			w->SetState(new RestState());
			w->WriteProgram();
		}else
		{
			if(w->GetTime()<21){
				cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl<<endl;
			}else
			{
				//找过21点
				//void SetState(State *s) //State *s = new SleepingState(); 
				w->SetState(new SleepingState());

				w->WriteProgram();
			}
		}
	}
	
};

//下午工作状态
class AfternoonState : public State
{
	
public:
	void WriteProgram(Work *w)
	{
		if(w->GetTime()<17)
		{
			cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl<<endl;
		}else
		{
			//void SetState(State *s) //State *s = new EveningState();
			w->SetState(new EveningState());

			w->WriteProgram();
		}
	}
};


//中午工作状态
class NoonState : public State
{
public:
	void WriteProgram(Work *w)
	{
		if (w->GetTime()<13)
			cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl<<endl;
		else
		{
			//void SetState(State *s) //State *s = new AfternoonState();
			w->SetState(new AfternoonState());
			w->WriteProgram();
		}
	}
	
	
};



//上午工作状态
class ForenoonState : public State
{
public:
	void WriteProgram(Work *w)
	{
		if(w->GetTime()<12)
			cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl<<endl;
		else
		{
			//void SetState(State *s) //State *s = new NoonState();
			w->SetState(new NoonState());
			w->WriteProgram();
		}
	}

	
};









void main()
{
	//紧急项目
	Work *emergencyProjects = new Work();
	//void SetState(State *s) //State *s = new ForenoonState();
	emergencyProjects->SetState(new ForenoonState());
	emergencyProjects->SetTime(9); 
	emergencyProjects->WriteProgram();
	

	emergencyProjects->SetTime(10);
	emergencyProjects->WriteProgram();

	emergencyProjects->SetTime(12);
	emergencyProjects->WriteProgram();


	emergencyProjects->SetTime(14);
	emergencyProjects->WriteProgram();

	//完成工作,不需要再加班了
	//emergencyProjects->SetFinish();

	
	emergencyProjects->SetTime(19);
	emergencyProjects->WriteProgram();

	emergencyProjects->SetTime(22);
	emergencyProjects->WriteProgram();

	system("pause");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值