状态模式(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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的状态模式示例,用于在C语言中实现状态转换: ```c #include <stdio.h> // 状态接口 typedef struct state { void (*print)(struct state*); // 打印方法 void (*change)(struct state*); // 转换方法 } state_t; // 具体状态实现 typedef struct { state_t base; // 继承状态接口 int value; // 状态值 } concrete_state_t; // 实现状态打印方法 void concrete_state_print(state_t* state) { concrete_state_t* s = (concrete_state_t*) state; printf("当前状态:%d\n", s->value); } // 实现状态转换方法 void concrete_state_change(state_t* state) { concrete_state_t* s = (concrete_state_t*) state; if (s->value == 1) { s->value = 2; } else { s->value = 1; } } // 状态管理器 typedef struct { state_t* state; // 当前状态 } context_t; // 初始化状态管理器 void context_init(context_t* ctx, state_t* state) { ctx->state = state; } // 更改状态 void context_change(context_t* ctx) { ctx->state->change(ctx->state); } // 打印当前状态 void context_print(context_t* ctx) { ctx->state->print(ctx->state); } int main() { concrete_state_t state1 = { { concrete_state_print, concrete_state_change }, 1 }; // 初始化状态1 concrete_state_t state2 = { { concrete_state_print, concrete_state_change }, 2 }; // 初始化状态2 context_t ctx; // 初始化状态管理器 context_init(&ctx, (state_t*) &state1); // 初始状态为1 context_print(&ctx); // 当前状态:1 context_change(&ctx); // 更改状态为2 context_print(&ctx); // 当前状态:2 context_change(&ctx); // 更改状态为1 context_print(&ctx); // 当前状态:1 return 0; } ``` 在上面的示例中,我们通过状态接口和具体状态实现来实现状态模式。当 `context_t` 中使用一个状态时,它会调用该状态的方法。通过更改 `context_t` 的状态,我们可以实现不同的行为。在这个例子中,我们有两种具体状态实现,它们打印不同的状态并且具有不同的转换行为。当我们更改状态时,我们可以看到输出切换为正确的状态输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值