状态模式(C++)

简述
当一个对象内在状态改变时,允许改变其行为,这个对象看起来像改变了其类,单控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移,到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化
场景说明
状态模式中,不同状态对象表现的也不同。就像变色龙一样,它随自己心情的变化会变成不同的颜色,它心情平静时为蓝色,心情兴奋时就变成了黄色
UML类图

对象说明
State,
抽象的状态类
CalmState,具体实现的状态类一
ExcitementState,具体实现的状态类一
CalmState 维护一个当前状态,状态切换时该对象的表现也不同
实现
//抽象状态类
class State
{
public:
	virtual void BodyColor() = 0;
};

class CalmState;
class ExcitementState;

//变色龙类
class Chameleon
{
public:
	friend class CalmState;
	friend class ExcitementState;

	Chameleon()
	{
		mCurrState = NULL;
	}

	void ShowBodyColor()
	{
		if (mCurrState == NULL)
		{
			ShowBlue();
			return;
		}
		mCurrState->BodyColor();
	}

	void SetState(State *currState)
	{
		mCurrState = currState;
	}


private:

	void ShowBlue()
	{
		std::cout << "变色龙变成蓝色" << std::endl;
	}
	void ShowYellow()
	{
		std::cout << "变色龙变成黄色" << std::endl;
	}

	State *mCurrState;		//当前状态
};

//具体实现状态  心情平静状态
class CalmState :public State
{
public:
	
	CalmState(Chameleon * chameleon)
	{
		mChameleon = chameleon;
	}

	void BodyColor()
	{
		std::cout << "变色龙心情平静" << std::endl;
		mChameleon->ShowBlue();
	}

private:
	Chameleon * mChameleon;
};

//具体实现状态  心情兴奋状态
class ExcitementState :public State
{
public:
	ExcitementState(Chameleon * chameleon)
	{
		mChameleon = chameleon;
	}

	void BodyColor()
	{
		std::cout << "变色龙心情兴奋" << std::endl;
		mChameleon->ShowYellow();
	}
private:
	Chameleon * mChameleon;
};

int main()
{
	Chameleon *chameleon = new Chameleon;
	chameleon->ShowBodyColor();

	ExcitementState *es = new ExcitementState(chameleon);
	CalmState *cs = new CalmState(chameleon);

	chameleon->SetState(es);
	chameleon->ShowBodyColor();

	chameleon->SetState(cs);
	chameleon->ShowBodyColor();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/niu2212035673/article/details/80242336
今日推荐