状态模式
一、状态模式的概念
状态模式属于行为型设计模式,它通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。
状态模式主要解决:当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表现不同状态的一系列类当中,从而使复杂的判断逻辑简单化。
二、状态模式使用场景
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)