设计模式C++版:第二十式状态模式
来源:互联网 发布:javascript图形编程 编辑:程序博客网 时间:2024/06/09 15:34
直接上代码好了:
#pragma once#include <iostream>//前置声明class Work;class State{public:virtual void writeprogram(Work *w){}virtual ~State(){ }};//工作类class Work{public:Work(State* state) :m_hour(0), m_state(state){}int gethour(){return m_hour;}void sethour(int hour){m_hour = hour;}void writeprogram(){m_state->writeprogram(this);}~Work(){}public:State *m_state;private:int m_hour;};//具体状态类class SleepState : public State{public:virtual void writeprogram(Work *w)override{int hour = w->gethour();if (hour>= 23||(hour>=0&&hour<6) ){printf("当前时间%d,赶紧睡觉\n", w->gethour());}else{}}};class EveningState : public State{public:virtual void writeprogram(Work *w)override{if (w->gethour() <=22 && w->gethour()>17){printf("当前时间%d,状态良好\n", w->gethour());}else{if (w->m_state != nullptr) //避免内存泄露{delete w->m_state;w->m_state = nullptr;}w->m_state = new SleepState;w->writeprogram();}}};class AfternoonState : public State{public:virtual void writeprogram(Work *w)override{if (w->gethour() <= 17 && w->gethour()>12){printf("当前时间%d,精神还不错\n", w->gethour());}else{if (w->m_state != nullptr) //避免内存泄露{delete w->m_state;w->m_state = nullptr;}w->m_state = new EveningState;w->writeprogram();}}};class ForenoonState : public State{public:virtual void writeprogram(Work *w)override{int hour = w->gethour();if (hour<=12 && hour>=6 ){printf("当前时间%d,精神很好\n", w->gethour());}else{if (w->m_state != nullptr) //避免内存泄露{delete w->m_state;w->m_state = nullptr;}w->m_state = new AfternoonState;w->writeprogram();}}};int main(){ForenoonState * forenoon = new ForenoonState;Work work(forenoon);for (int i = 0; i < 24;i++){work.sethour(i);work.writeprogram();}//运行到i == 6 并没有返回至早上状态 一直都是 sleepstate 。//如果返回在sleep状态,返回到sleep 状态,如果循环中存在//>=24的元素,将会处在状态死循环中。//另外状态模式在存在M个可选择状态时,会每次都遍历一遍,//比较M次.所有状态都过一遍,就是M*M次,而是用switch case//只会进行 2*M次,效率明显高出。同时由于default的存在,//不会出现状态死循环。delete forenoon;return 0;}
阅读全文
0 0
- 设计模式C++版:第二十式状态模式
- 设计模式学习第二十天
- C语言设计模式:状态模式
- 设计模式(1)-状态模式(C++)
- 设计模式之状态模式(c++)
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 第五章 第二节:数值运算符和函数
- Maven之(五)Maven仓库
- Bug严重度分类、测试结束标准、bug只出现一次的处理
- 重载运算符与友元函数
- table 操作——点击表格某一行获取这一行的某一个单元格
- 设计模式C++版:第二十式状态模式
- javabean为什么要实现序列化
- QT下简易画板实现
- nginx的那些事
- 状态压缩DP
- JavaScript 验证 API
- 玩转Google开源C++单元测试框架Google Test系列
- Partial Sum
- (多核DSP快速入门)8、利用MessageQ模块的多核灰度转换程序