设计模式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;}


原创粉丝点击