设计模式C++版:第二十式状态模式

xiaoxiao2021-02-27  150

直接上代码好了:

#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; }

转载请注明原文地址: https://www.6miu.com/read-14939.html

最新回复(0)