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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月01日 15时22分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Git:git如何拉取指定分支到本地
2021-06-30
5.2 使用MySQL数据库
2021-06-30
5.3 使用SQLite数据库
2021-06-30
5.4 使用PostgreSQL数据库
2021-06-30
5.5 使用beedb库进行ORM开发
2021-06-30
5.6 NOSQL数据库操作
2019-04-27
第六章 session和数据存储
2019-04-27
6.1 session和cookie
2019-04-27
6.2 Go如何使用session
2019-04-27
7.5 文件操作
2019-04-27
12.4 备份和恢复
2019-04-27
第十三章 如何设计一个Web框架
2019-04-27
13.1 项目规划
2019-04-27
13.2 自定义路由器设计
2019-04-27
13.3 controller设计
2019-04-27
13.4 日志和配置设计
2019-04-27
13.5 实现博客的增删改
2019-04-27
第十四章 扩展Web框架
2019-04-27
Go语言教程拓展基础篇 (查漏补缺, 献给初学者)
2019-04-27
14.1 静态文件支持
2019-04-27