直接上代码好了:
#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;
}