ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大话设计模式(6)——状态模式(State Pattern)

2021-06-10 10:02:39  阅读:168  来源: 互联网

标签:Pattern void state War public State 设计模式 war


状态模式(State Pattern)

**状态模式(State):**当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
在这里插入图片描述
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以容易地增加新的状态和转换。
目的是消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

#include <iostream>
using namespace std;
#include <list>
#include <string>

class War;
class State {
public:
	//不能使用纯虚析构
	virtual void Prophase() {}
	virtual void Metaphase() {}
	virtual void Anaphase() {}
	virtual void End() {}
	virtual void CurrentState(War* war) = 0;
};

class War {
public:
	War(State* state):m_state(state), m_days(0){}
	~War(){}	
	void SetDays(int days) { m_days = days; }
	int GetDays() { return m_days; }
	void SetState(State* state) { m_state = state; }
	void GetState() { m_state->CurrentState(this); }
private:
	State* m_state;
	int m_days;
};

//具体的状态类
class EndState :public State {
public:
	void End(War* war) {
		cout << "战争结束" << endl;
	}
	void CurrentState(War* war) { End(war); }
};
class AnaphaseState :public State {
public:
	void Anaphase(War* war) {
		if (war->GetDays() < 30) {
			cout << "第" << war->GetDays() << "天,战争后期" << endl;
		}
		else {
			war->SetState(new EndState());
			war->GetState();
		}
	}
	void CurrentState(War* war) { Anaphase(war); }
};
class MetaphaseState :public State {
public:
	void Metaphase(War* war) {
		if (war->GetDays() < 20) {
			cout << "第" << war->GetDays() << "天,战争中期" << endl;
		}
		else {
			war->SetState(new AnaphaseState());
			war->GetState();
		}
	}
	void CurrentState(War* war) { Metaphase(war); }
};
class ProphaseState :public State {
public:
	void Prophase(War* war) {
		if (war->GetDays() < 10)
			cout << "第" << war->GetDays() << "天,战争初期" << endl;
		else {
			war->SetState(new MetaphaseState);
		}
	}
	void CurrentState(War* war) { Prophase(war); }
};

int main() {

	War* war = new War(new ProphaseState());
	for (int i = 1; i < 40; i += 5)
	{
		war->SetDays(i);
		war->GetState();
	}
	delete war;
	return 0;
	
	return 0;
}

标签:Pattern,void,state,War,public,State,设计模式,war
来源: https://blog.csdn.net/Acquisition0818/article/details/117755408

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有