状态模式

《大话设计模式》

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

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

可以把复杂的判断逻辑简化。

//state.h

#ifndef _STATE_H_
#define _STATE_H_
#include <iostream>

using namespace std;

class State;

class Work
{
	public:
		Work():current(NULL){}
		~Work(){}
		double getHour();
		void setHour(double hour);	
		bool getFinish();	
		void setFinish(bool finish);	
		void setState(State *s);
		void writeProgramm();
			
	private:
		auto_ptr<State> current;
		double hour;
		bool finish;
};

class State
{
	public:
		virtual ~State()
		{
			cout << "State destructor" << endl;
		}
		virtual void writeProgramm(Work *w) = 0;
};

class ForenoonState:public State
{
	public:
		~ForenoonState()
		{
			cout << "ForenoonState" << endl;
		}
		void writeProgramm(Work *w);
};

class NoonState:public State
{
	public:
		~NoonState()
		{
			cout << "NoonState" << endl;
		}
		void writeProgramm(Work *w);
};

class AfternoonState:public State
{
	public:
		~AfternoonState()
		{
			cout << "AfternoonState" << endl;
		}
		void writeProgramm(Work *w);
};

class EveningState:public State
{
	public:
		~EveningState()
		{
			cout << "EveningState" << endl;
		}
		void writeProgramm(Work *w);
};

class SleepingState:public State
{
	public:
		~SleepingState()
		{
			cout << "SleepingState" << endl;
		}
		void writeProgramm(Work *w);
};

class RestState:public State
{
	public:
		~RestState()
		{
			cout << "RestState" << endl;
		}
		void writeProgramm(Work *w);
};
#endif

//state.cpp

#include "state.h"

double Work::getHour()
{
	return hour;
}
void Work::setHour(double hour)
{
	this->hour = hour;
}
		
bool Work::getFinish()
{
	return finish;
}
void Work::setFinish(bool finish)
{
	this->finish = finish;
}
		
void Work::setState(State *s)
{
	current = auto_ptr<State>(s);
}

void Work::writeProgramm()
{
	current->writeProgramm(this);
}

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

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

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

void EveningState::writeProgramm(Work *w)
{
	if(w->getFinish()) 
	{
		w->setState(new RestState());
		w->writeProgramm();
	} 
	else
	{ 
		if(w->getHour() < 21)
		{
			cout << "当地时间:" <<  w->getHour() << "点 下加班哦,疲惫之极。" << endl; 
		}
		else
		{
		 	w->setState(new SleepingState());
		 	w->writeProgramm(); 
		} 
	} 
}

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

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

//stateMain.cpp

#include "state.h"

int main()
{
	Work project;
	project.setState(new ForenoonState()); 
	project.setHour(9); 
	project.writeProgramm();
	cout << "--------------" << endl; 
	project.setHour(10); 
	project.writeProgramm();
	cout << "--------------" << endl;
	project.setHour(12); 
	project.writeProgramm();
	cout << "--------------" << endl; 
	project.setHour(13); 
	project.writeProgramm();
	cout << "--------------" << endl; 
	project.setHour(14); 
	project.writeProgramm();
	cout << "--------------" << endl;
	project.setHour(17); 
	project.setFinish(false); 
	project.writeProgramm();
	cout << "--------------" << endl;
	project.setHour(19); 
	project.writeProgramm();
	cout << "--------------" << endl; 
	project.setHour(22); 
	project.writeProgramm();
	cout << "--------------" << endl;  
	
	return 0;
}

输出结果:

当地时间:9点 上午工作,精神百倍
--------------
当地时间:10点 上午工作,精神百倍
--------------
ForenoonState
State destructor
当地时间:12点 饿了,午饭;犯困,午休。
--------------
NoonState
State destructor
当地时间:13点 下午状态还不错,继续努力。
--------------
当地时间:14点 下午状态还不错,继续努力。
--------------
AfternoonState
State destructor
当地时间:17点 下加班哦,疲惫之极。
--------------
当地时间:19点 下加班哦,疲惫之极。
--------------
EveningState
State destructor
当地时间:22点 不行了,睡着了。
--------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值