设为首页 加入收藏

TOP

设计模式C++实现――状态模式
2015-07-24 06:13:09 来源: 作者: 【 】 浏览:22
Tags:设计模式 实现 状态 模式

模式定义

状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

模式结构:

\

Context:<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+u7e+s7ao0uW/zbunuNDQy8iktcS907/aPC9wPgo8cD7OrLuk0ru49kNvbmNyZXRlU3RhdGXX08DgtcTKtcD9o6zV4rj2yrXA/bao0uW1scew17TMrDwvcD4KPHA+U3RhdGU6PC9wPgo8cD62qNLl0ru49r3Tv9q34tew0+tDb250ZXh0tcTSu7j2zNi2qNe0zKzP4LnYtcTQ0M6qPC9wPgo8cD5Db25jcmV0ZVN0YXRlIHN1YmNsYXNzZXM6PC9wPgo8cD7Dv9K719PA4Mq1z9bSu7j20+tDb250ZXh0tcTSu7j217TMrM/gudi1xNDQzqo8L3A+CjxoMT6+2cD9o7o8L2gxPgo8cD4gICAgICAgINK7uPa5pMjL0rvM7LXEyrG85LfWzqrJz7Dgo6zLr771o6y4ycbky/vKwsfpyP249sqxvOS2zqGjztLDx7/J0tTTw9e0zKzEo8q9wLSx7cq+0rvM7NbQ1Nq4ycqyw7TKwsfpoaM8L3A+CjxoMT5VTUzJ6LzGo7o8L2gxPgo8cD4gPGltZyBzcmM9"http://www.cppentry.com/upload_files/article/49/1_r2q8t__.jpg" alt="\">

编程实现及执行结果:

#include 
  
   
using namespace std;


class Worker;	//类的前置声明

//状态类
class State
{
public:
	virtual void doing(Worker* w){}
};
//工作状态
class WorkingState: public State
{
public:
	void doing(Worker* worker);
};
//休息状态
class SleepingState: public State
{
public:
	void doing(Worker* worker);
};
//其他状态
class OtherState : public State
{
public:
	void doing(Worker* worker);
};

//工人类
class Worker
{
public:
	Worker()
	{
		state = new WorkingState();
	}
	void setState(State* stat)
	{
		state = stat;
	}
	double getHour()
	{
		return hour;
	}
	void setHour(double hou)
	{
		hour = hou;
	}

	void requestDoing()
	{
		state->doing(this);
	}
private:
	State* state;
	double hour;
};
//各个状态doing方法的实现
void WorkingState::doing(Worker* worker)
{
	if(worker->getHour() > 8 && worker->getHour()  < 16)
		cout << "WorkingState!" << endl;
	else
	{
		worker->setState(new OtherState());
		worker->requestDoing();
	}
}

void SleepingState::doing(Worker* worker)
{
	if(worker->getHour()  >= 21 || worker->getHour()  < 5)
		cout << "SleepingState!" << endl;
	else
	{
		worker->setState(new OtherState());
		worker->requestDoing();

	}
}

void OtherState::doing(Worker* worker)
{
	if((worker->getHour() >= 5 && worker->getHour() < 8) 
			|| (worker->getHour() >= 16 && worker->getHour() < 21))
		cout << "SleepingState!" << endl;
	else if(worker->getHour() >= 21 || worker->getHour() < 5)
	{
		worker->setState(new SleepingState());
		worker->requestDoing();
	}
	else
	{
		worker->setState(new WorkingState());
		worker->requestDoing();
	}
}
//客户代码
int main()
{
	Worker* pWorker = new Worker();
	pWorker->setHour(24);
	cout << "time 24" << endl;
	pWorker->requestDoing();

	pWorker->setHour(11.5);
	cout << "time 11.5" << endl;
	pWorker->requestDoing();

	pWorker->setHour(19);
	cout << "time 19" << endl;
	pWorker->requestDoing();
	
	delete pWorker;
	return 0;
}
  


执行结果:

time24

SleepingState!

time11.5

WorkingState!

time19

SleepingState!

请按任意键继续. . .

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 3278 Catch That Cow(BFS 剪.. 下一篇一种使用GDI+对图片尺寸和质量的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: