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

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"https://www.cppentry.com/upload_files/article/49/1_r2q8t__.jpg" alt="\">
编程实现及执行结果:
#includeusing 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!
请按任意键继续. . .