当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可考虑用到状态模式
#include "stdafx.h"
#include <iostream>
using namespace std;
class job;
class afternoon_state;
class night_state;
class noon_state;
class state
{
public:
state(){}
virtual ~state() {}
virtual void DoJob(job* pjob) = 0;
};
class job
{
public:
job();
~job() {}
void set_state(state* pstate) { m_pstate = pstate; }
void do_job()
{
m_pstate->DoJob(this);
}
private:
state* m_pstate;
public:
int m_hour;
};
class noon_state : public state
{
public:
noon_state() {}
virtual ~noon_state() {}
virtual void DoJob(job* pjob);
};
class afternoon_state : public state
{
public:
afternoon_state() {}
virtual ~afternoon_state() {}
virtual void DoJob(job* pjob);
};
class night_state : public state
{
public:
night_state() {}
virtual ~night_state() {}
virtual void DoJob(job* pjob);
};
job::job()
{
m_pstate = new noon_state();
}
void noon_state::DoJob(job* pjob)
{
if (pjob->m_hour >= 0 && pjob->m_hour < 14)
{
cout<<"好想睡觉,不想干活"<<endl;
}
else
{
pjob->set_state(new afternoon_state());
pjob->do_job();
}
}
void night_state::DoJob(job* pjob)
{
if (pjob->m_hour >= 18 && pjob->m_hour < 24)
{
cout<<"晚上啦,下班回家"<<endl;
}
else
{
pjob->set_state(new noon_state());
pjob->do_job();
}
}
void afternoon_state::DoJob(job* pjob)
{
if (pjob->m_hour >= 14 && pjob->m_hour < 18)
{
cout<<"下午时间,好好干活"<<endl;
}
else
{
pjob->set_state(new night_state());
pjob->do_job();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
job test;
test.m_hour = 6;
test.do_job();
test.m_hour = 15;
test.do_job();
test.m_hour = 20;
test.do_job();
system("pause");
return 0;
}