状态模式
定义:当一个对象的内在状态改变时,允许改变它的行为,这个对象看起来像是改变了其类。
它属于行为型模式
栗子场景:一天根据当前的时间段,来决定一个人是吃早饭还是午饭以及晚饭。即根据时间的状态变化,改变人吃什么的行为。
代码:
#include <iostream>
#include <Windows.h>
using namespace std;
class Eat;
class MealStatus
{
public:
virtual void doEat(Eat *eat) = 0;
};
class Eat{
public:
Eat(MealStatus *m) :m_status(nullptr)
{
m_status = m;
}
~Eat()
{
if (m_status)
{
delete m_status;
m_status = nullptr;
}
}
void request()
{
m_status->doEat(this);
}
void setStatus(MealStatus* s)
{
m_status = s;
}
void setHour(int h)
{
m_hour = h;
}
int getHour()
{
return m_hour;
}
private:
MealStatus* m_status;
int m_hour;
};
//夜宵
class NightSnack :public MealStatus
{
public:
NightSnack(){}
void doEat(Eat *eat)
{
cout << "吃夜宵时间段来了,吃货的一天准备结束啦" << " current-time=" << eat->getHour() << endl;
}
};
//晚餐
class Dinner :public MealStatus
{
public:
Dinner(){}
void doEat(Eat *eat)
{
if (eat->getHour() < 21)
{
cout << "吃晚饭时间段" << " current-time=" << eat->getHour() << endl;
}
else
{
eat->setStatus(new NightSnack);
eat->request();
}
}
};
//午餐
class Lunch :public MealStatus
{
public:
Lunch(){}
void doEat(Eat *eat)
{
if (eat->getHour()<14)
{
cout << "吃午饭时间段" << " current-time="<<eat->getHour()<<endl;
}
else
{
eat->setStatus(new Dinner);
eat->request();
}
}
};
//早餐
class Breakfast :public MealStatus
{
public:
Breakfast(){}
void doEat(Eat *eat)
{
if (eat->getHour() < 9)
{
cout << "吃早饭时间段" << " current-time=" << eat->getHour()<< endl;
}
else
{
eat->setStatus(new Lunch);
eat->request();
}
}
};
int main()
{
Eat *eat = new Eat(new Breakfast);
//切换状态
eat->setHour(8);
eat->request();
eat->setHour(13);
eat->request();
eat->setHour(20);
eat->request();
eat->setHour(24);
eat->request();
if (eat)
{
delete eat;
eat = nullptr;
}
return 0;
}
效果