模式定义
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
模式结构:

Context:<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+u7e+s7ao0uW/zbunuNDQy8iktcS907/aPC9wPgo8cD7OrLuk0ru49kNvbmNyZXRlU3RhdGXX08DgtcTKtcD9o6zV4rj2yrXA/bao0uW1scew17TMrDwvcD4KPHA+U3RhdGU6PC9wPgo8cD62qNLl0ru49r3Tv9q34tew0+tDb250ZXh0tcTSu7j2zNi2qNe0zKzP4LnYtcTQ0M6qPC9wPgo8cD5Db25jcmV0ZVN0YXRlIHN1YmNsYXNzZXM6PC9wPgo8cD7Dv9K719PA4Mq1z9bSu7j20+tDb250ZXh0tcTSu7j217TMrM/gudi1xNDQzqo8L3A+CjxoMT6+2cD9o7o8L2gxPgo8cD4gICAgICAgINK7uPa5pMjL0rvM7LXEyrG85LfWzqrJz7Dgo6zLr771o6y4ycbky/vKwsfpyP249sqxvOS2zqGjztLDx7/J0tTTw9e0zKzEo8q9wLSx7cq+0rvM7NbQ1Nq4ycqyw7TKwsfpoaM8L3A+CjxoMT5VTUzJ6LzGo7o8L2gxPgo8cD4gPGltZyBzcmM9"http://www.cppentry.com/upload_files/article/49/1_r2q8t__.jpg" alt="\">
编程实现及执行结果:
#include
using namespace std;
class Worker; //类的前置声明
//状态类
class State
{
public:
virtual void doing(Worker* w){}
};
//工作状态
class WorkingState: public State
{
public:
void doing(Worker* worker);
};
//休息状态
class SleepingState: public State
{
public:
void doing(Worker* worker);
};
//其他状态
class OtherState : public State
{
public:
void doing(Worker* worker);
};
//工人类
class Worker
{
public:
Worker()
{
state = new WorkingState();
}
void setState(State* stat)
{
state = stat;
}
double getHour()
{
return hour;
}
void setHour(double hou)
{
hour = hou;
}
void requestDoing()
{
state->doing(this);
}
private:
State* state;
double hour;
};
//各个状态doing方法的实现
void WorkingState::doing(Worker* worker)
{
if(worker->getHour() > 8 && worker->getHour() < 16)
cout << "WorkingState!" << endl;
else
{
worker->setState(new OtherState());
worker->requestDoing();
}
}
void SleepingState::doing(Worker* worker)
{
if(worker->getHour() >= 21 || worker->getHour() < 5)
cout << "SleepingState!" << endl;
else
{
worker->setState(new OtherState());
worker->requestDoing();
}
}
void OtherState::doing(Worker* worker)
{
if((worker->getHour() >= 5 && worker->getHour() < 8)
|| (worker->getHour() >= 16 && worker->getHour() < 21))
cout << "SleepingState!" << endl;
else if(worker->getHour() >= 21 || worker->getHour() < 5)
{
worker->setState(new SleepingState());
worker->requestDoing();
}
else
{
worker->setState(new WorkingState());
worker->requestDoing();
}
}
//客户代码
int main()
{
Worker* pWorker = new Worker();
pWorker->setHour(24);
cout << "time 24" << endl;
pWorker->requestDoing();
pWorker->setHour(11.5);
cout << "time 11.5" << endl;
pWorker->requestDoing();
pWorker->setHour(19);
cout << "time 19" << endl;
pWorker->requestDoing();
delete pWorker;
return 0;
}
执行结果:
time24
SleepingState!
time11.5
WorkingState!
time19
SleepingState!
请按任意键继续. . .