状态模式

#include "stdafx.h"
#include <IOSTREAM>


using namespace std;
class Work;

class State
{
public:
	State(){};
	virtual ~State(){};
	virtual void WriteProgram(Work *w) = 0;
	int getName(){
		return m_name;
	}
	void setName(int name){
		m_name = name;
	}
private:
	int m_name;
};

class Work
{
private:
	State *current;//µ±Ç°×´Ì¬
	State *s1;//µ±Ç°×´Ì¬
	State *s2;//µ±Ç°×´Ì¬
	State *s3;//µ±Ç°×´Ì¬
	State *s4;//µ±Ç°×´Ì¬
	State *s5;//µ±Ç°×´Ì¬
	State *s6;//µ±Ç°×´Ì¬
	double hour;
	bool taskFinish;	
public:
	Work():s1(NULL),s2(NULL),s3(NULL),s4(NULL),s5(NULL),s6(NULL)
	{
		taskFinish = false;
	}
	~Work(){
		if (s1)
		{
			delete s1;
			s1 = NULL;
			cout<<"delete s1"<<endl;
		}
		if (s2)
		{
			delete s2;
			s2 = NULL;
			cout<<"delete s2"<<endl;
		}
		if (s3)
		{
			delete s3;
			s3 = NULL;
			cout<<"delete s3"<<endl;
		}
		if (s4)
		{
			delete s4;
			s4 = NULL;
			cout<<"delete s4"<<endl;
		}
		if (s5)
		{
			delete s5;
			s5 = NULL;
			cout<<"delete s5"<<endl;
		}
		if (s6)
		{
			delete s6;
			s6 = NULL;
			cout<<"delete s6"<<endl;
		}
	//s2-s5,current
	};

	void SetTime(double hour)
	{
		this->hour = hour;
	}
	double GetTime()
	{
		return this->hour;
	}
	//ÉèÖÃ״̬
	void SetState(State *s)
	{
		if (s->getName() == 1)
		{
			s1 = s;
		}
		else if (s->getName() == 2)
		{
			s2 = s;
		}else if (s->getName() == 3)
		{
			s3 = s;
		}else if (s->getName() == 4)
		{
			s4 = s;
		}else if (s->getName() == 5)
		{
			s5 = s;
		}else if (s->getName() == 6)
		{
			s6 = s;
		}
		current = s;
	}
	//ÉèÖù¤³ÌÊÇ·ñÍê³É
	void SetFinish()
	{
		taskFinish = true;
	}
	bool GetFinish()
	{
		return taskFinish;
	}
	void WriteProgram()
	{
		if (current)
		{
			current->WriteProgram(this);
		}
	}
	
};
//Ï°àÐÝϢ״̬
class RestState : public State
{
public:
	RestState(){
		this->setName(1);
	};
	virtual ~RestState(){};
	void WriteProgram(Work *w)
	{
		cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¹¤×÷Íê³É£¬Ï°à»Ø¼ÒÁË"<<endl;
	}
};
//˯Ãß¹¤×÷״̬
class SleepingState : public State
{
public:
	SleepingState(){
		this->setName(2);
	};
	virtual ~SleepingState(){
	};
	void WriteProgram(Work *w)
	{
		cout<<"Êܲ»ÁËÁË,"<<w->GetTime()<<"µãÁË£¬ÏÈ˯°É"<<endl;
	}
};
//ÍíÉϹ¤×÷״̬
class EveningState : public State
{
public:
	EveningState(){
		this->setName(3);
	};
	virtual ~EveningState(){
	};
	void WriteProgram(Work *w)
	{
		//ÈÎÎñÍê³ÉÁË£¬¿ÉÒÔÐÝÏ¢ÁË
		if(w->GetFinish())
		{
			w->SetState(new RestState());
			w->WriteProgram();
		}else
		{
			if(w->GetTime()<21){
				cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¼Ó°àÁË£¬Æ£±¹ÖÁ¼«"<<endl;
			}else
			{
				//ÕÒ¹ý21µã
				w->SetState(new SleepingState());
				w->WriteProgram();
			}
		}
	}
	
};
class AfternoonState : public State
{
	
public:
	AfternoonState(){
		this->setName(4);
	};
	virtual ~AfternoonState(){
	};
	void WriteProgram(Work *w)
	{
		if(w->GetTime()<17)
		{
			cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ״̬»¹²»´í£¬¼ÌÐøŬÁ¦"<<endl;
		}else
		{
			w->SetState(new EveningState());
			w->WriteProgram();
		}
	}
};
//ÖÐÎ繤×÷״̬
class NoonState : public State
{
public:
	NoonState(){this->setName(5);};
	virtual ~NoonState(){
	};
	void WriteProgram(Work *w)
	{
		if (w->GetTime()<13)
			cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ¶öÁË£¬Îç·¹:·¸À§£¬ÎçÐÝ"<<endl;
		else
		{
			w->SetState(new AfternoonState());
			w->WriteProgram();
		}
	}
	
	
};
//ÉÏÎ繤×÷״̬
class ForenoonState : public State
{
public:
	ForenoonState(){
		this->setName(6);
	}
	virtual ~ForenoonState(){};
	void WriteProgram(Work *w)
	{
		if(w->GetTime()<12)
			cout<<"µ±Ç°Ê±¼ä:"<<w->GetTime()<<"µã ÉÏÎ繤×÷£¬¾«Éñ°Ù±¶"<<endl;
		else
		{
			w->SetState(new NoonState());
			w->WriteProgram();
		}
	}
};
void main()
{
	//½ô¼±ÏîÄ¿
	Work *emergencyProjects = new Work();
	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();
	if (emergencyProjects)
	{
		delete emergencyProjects;
		emergencyProjects = NULL;
	}
}

状态模式(State Pattern)是设计模式的一种,属于行为模式。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值