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

状态模式(State Pattern)

**状态模式(State):**当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
大话设计模式(6)——状态模式(State Pattern)
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个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;
}
上一篇:IDEA导出war包


下一篇:spring boot 打war包,最简单的方式