五、状态模式

状态模式

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

在这里插入图片描述
在这里极力推荐一部电影《肖申克的救赎》,下面用状态模式来实现男主的经历:
剧情简单介绍(百度的):
《肖申克的救赎》的故事发生在1947年,银行家安迪(Andy)被指控枪杀了妻子及其情人,安迪被判无期徒刑,这意味着他将在肖申克监狱中渡过余生。男主安迪是1948年到的肖申克,1967年挖好的洞,但他一直到1975年才越狱。所以他在监狱中一共关了27年。

#include<iostream>
#include<list>
#include<string>
using namespace std;
class Andy;//男主
class State//状态
{
public:
	string m_satedes;//描述当前的状态
public:
	virtual void Fbegin(){};//前期状态
	virtual void Fmid(){};//中期状态
	virtual void Fend(){};//末期状态
	virtual void CurrentState(Andy*p_andy){};//调用当前状态,统一的接口,然后各个状态子类去调用自己的函数
};
class Andy
{
private:
	State *m_state;  //目前状态
	int m_years;      //时间
public:
	Andy(State *state): m_state(state), m_years(0) {}
	~Andy() { delete m_state; }
	int GetYears() { return m_years; }
	void SetYears(int years) { m_years = years; }
	void SetState(State *state) { delete m_state; m_state = state; }
	void GetState() { m_state->CurrentState(this); }
};


//服刑末期
class State_End:public State
{
public:
	State_End()
	{
		m_satedes = "挖洞逃出来了";
	}

	void FEnd(Andy *p_andy)
	{
		cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
	}
	void CurrentState(Andy *p_andy)
	{
		FEnd(p_andy);
	}
};

//服刑中期
class State_Mid:public State
{
public:
	State_Mid()
	{
		m_satedes = "服刑中期,每天帮监狱长做假账,顺便开始夜里挖洞";
	}

	void FMid(Andy *p_andy)
	{
		if(p_andy->GetYears()<28)
		{
			cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
		}
		else
		{
			p_andy->SetState(new State_End());
			p_andy->GetState();
		}

	}
	void CurrentState(Andy *p_andy)
	{
		FMid(p_andy);
	}
};

//服刑前期
class State_begin:public State
{
public:
	State_begin()
	{
		m_satedes = "男主Andy刚进监狱,处处受人欺负";
	}

	void Fbegin(Andy *p_andy)
	{
		if(p_andy->GetYears()<5)
		{
			cout<<"第"<<p_andy->GetYears()<<"年"<<m_satedes<<endl;
		}
		else
		{
			p_andy->SetState(new State_Mid());
			p_andy->GetState();
		}
		
	}
	void CurrentState(Andy *p_andy)
	{
		Fbegin(p_andy);
	}
};



int main()
{
	Andy *p = new Andy(new (State_begin));
	for(int i = 1; i < 40; ++i)
	{
		p->SetYears(i);
		p->GetState();
	}
	delete p;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值