c++之状态模式
发布日期:2021-09-25 21:40:55 浏览次数:2 分类:技术文章

本文共 1736 字,大约阅读时间需要 5 分钟。

状态模式

定义:当一个对象的内在状态改变时,允许改变它的行为,这个对象看起来像是改变了其类。

它属于行为型模式

栗子场景:一天根据当前的时间段,来决定一个人是吃早饭还是午饭以及晚饭。即根据时间的状态变化,改变人吃什么的行为。

代码:

#include 
#include
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="<
getHour()<
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;}

效果

转载地址:https://blog.csdn.net/c_shell_python/article/details/107486700 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++之原型模式
下一篇:c++函数模板与类模板

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月01日 15时22分39秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章