设计模式-状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一些列类当中,可以把复杂的判断逻辑简化。

好处:将与特定状态相关的行为局部化,并且将不同状态的行为分离开来,将特定的状态相关的行为放入一个对象中,通过定义新的子类可以很容易的增加新的状态和转换。

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


实例代码如下:

#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 Work
{
private:
	State *m_CurrentState;
	int m_Hour;
public:
	Work()
	{
		m_CurrentState=new ForenoonState;
	}
	~Work()
	{
		delete m_CurrentState;
	}
	
	void SetHour(int hour)
	{
		m_Hour=hour;
	}
	int GetHour(void)
	{
		return m_Hour;
	}
	
	void SetState(State *state)
	{
		delete m_CurrentState;
		m_CurrentState=state;
	}
	
	void WriteProgram()
	{
		m_CurrentState->WriteProgram(this);
	}
};

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()<18)
	{
		cout<<"现在时刻:"<<w->GetHour()<<"下午工作,精神一般"<<endl;
	}
	else
	{
		w->SetState(new EveningState);
		w->WriteProgram();
	}
}

void EveningState::WriteProgram(Work *w)
{
	cout<<"晚上下班回家"<<endl;
}


void main()
{
	Work w;
	w.SetHour(8);
	w.WriteProgram();

	w.SetHour(9);
	w.WriteProgram();

	w.SetHour(12);
	w.WriteProgram();

	w.SetHour(13);
	w.WriteProgram();

	w.SetHour(18);
	w.WriteProgram();
}

这个程序中定义了工作Work的四种状态,ForenoonState、NoonState、AfternoonState、EveningState,这四种状态都为Wrok提供了行为WriteProgram,不同状态下行为WriteProgram也不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值