设计模式之状态模式-看看状态怎么样?

状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。当对象的行为取决于其状态并且随着状态变化而变化时,可以使用状态模式。这种模式将与特定状态相关的行为封装在独立的类中,使得对象的状态转变可以转化为对象内部状态类的切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、状态模式的概念

状态模式属于行为型设计模式,它通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。

状态模式主要解决:当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表现不同状态的一系列类当中,从而使复杂的判断逻辑简单化。

二、状态模式使用场景

1、行为随状态改变而改变的场景。
2、条件和分支语句的替代者。

三、状态模式构建方法

1、用户对象(上下文环境)类(Context)

拥有一个状态类型的成员,以标识对象的当前状态,并提供给客户端调用的接口。

2、抽象状态类(State)

封装与用户对象的特定状态相关行为的接口和方法。

3、具体状态类(ConcreteState)

实现抽象状态类定义的接口和方法。

四、状态模式的示例

// StatePattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>

#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}

using namespace std;

// 根据时间点不同模仿一个人吃早饭、午饭、晚饭的状态,其他时间状态都设置在工作
class EatMeal;
//class MorningTimeState;
//class NoonTimeState;
//class NightTimeState;

// 抽象状态类(State)
class TimeState
{
   
public:
	virtual void changeTimeState(int timeState) = 0;
	virtual void toEatMeal(EatMeal *pEatMeal) = 0;
};

// 用户对象(上下文环境)类(Context)-去吃饭
class EatMeal
{
   
public:
	EatMeal()
	{
   
		m_curTimeState = nullptr;
	}

	~EatMeal()
	{
   
		DELETE_PTR(m_curTimeState);
	}

	void changeTimeState(int timeState)
	{
   
		m_timeState = timeState;
	}

	int getCurTime()
	{
   
		return m_timeState;
	}

	void setTimeState(TimeState *pCurTimeState)
	{
   
		m_curTimeState = pCurTimeState;
	}

	TimeState *getTimeState()
	{
   
		return m_curTimeState;
	}

	void toEatMeal()
	{
   
		m_curTimeState->toEatMeal(this)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值