设计模式之状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

状态模式通过把各种状态逻辑分布到state的子类之间,减少了相互间的依赖。

优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

目的:为了消除庞大的条件分支语句。

适用于:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。可以考虑状态模式。

代码:

#include <iostream>

using namespace std;

class Work;

class State
{
	public:
		virtual void WriteProgram(Work* w) = 0;
};

class ForenoonState : public State
{
	public:
		void WriteProgram(Work* w);
};

class NoonState : public State
{
	public:
		void WriteProgram(Work* w);
};

class AfternoonState : public State
{
	public:
		void WriteProgram(Work* w);
};

class EveningState : public State
{
	public:
		void WriteProgram(Work* w);
};

class SleepingState : public State
{
	public:
		void WriteProgram(Work* w);
};

class RestState : public State
{
	public:
		void WriteProgram(Work* w);
};


class Work
{
	public:
		Work()
		{
			current = new ForenoonState();
		}
		double getHour()
		{
			return hour;
		}
		void setHour(double value)
		{
			hour = value;
		}
		bool getTaskFinished()
		{
			return finish;
		}
		void setTaskFinished(bool value)
		{
			finish = value;
		}
		void SetState(State* s)
		{
			current = s;
		}
		void WriteProgram()
		{
			current->WriteProgram(this);
		}
	private:
		State* current;
		double hour;
		bool finish = false;
};


void ForenoonState::WriteProgram(Work* w)
{
	if(w->getHour() < 12) 
	{
		cout << "当前时间:" << w->getHour() << "点 上午工作,精神百倍" << endl;
	}
	else
	{
		w->SetState(new NoonState());
		w->WriteProgram();
	}
}

void NoonState::WriteProgram(Work* w)
{
	if(w->getHour() < 13) 
	{
		cout << "当前时间:" << w->getHour() << "点 饿了,午饭;犯困,午休" << endl;
	}
	else
	{
		w->SetState(new AfternoonState());
		w->WriteProgram();
	}
}

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

void EveningState::WriteProgram(Work* w)
{
	if(w->getTaskFinished()) 
	{
		w->SetState(new RestState());
		w->WriteProgram();
	}
	else
	{
		if(w->getHour() < 21)
			cout << "当前时间:" << w->getHour() <<"点 加班哦,疲累之极" << endl;
		else
		{
			w->SetState(new SleepingState());
			w->WriteProgram();
		}
	}
}


void SleepingState::WriteProgram(Work* w)
{
	cout << "当前时间:" << w->getHour() << "点 不行了,睡着了" << endl;
}

void RestState::WriteProgram(Work* w)
{
		cout << "当前时间:" << w->getHour() << "点 下班回家了" << endl;
}


int main()
{
	Work* emergencyProjects = new Work();
	emergencyProjects->setHour(9);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(10);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(12);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(13);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(14);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(17);
	
	emergencyProjects->setTaskFinished(false);
	
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(19);
	emergencyProjects->WriteProgram();
	emergencyProjects->setHour(22);
	emergencyProjects->WriteProgram();
	
	
	
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值