状态模式

最后更新于:2022-04-01 20:29:41

## 模式定义       状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 ## 模式结构: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54593859f1.jpg) Context: 环境定义客户感兴趣的接口 维护一个ConcreteState子类的实例,这个实例定义当前状态 State: 定义一个接口封装与Context的一个特定状态相关的行为 ConcreteState subclasses: 每一子类实现一个与Context的一个状态相关的行为 ## 举例:       一个工人一天的时间分为上班,睡觉,干其他事情三个时间段。我们可以用状态模式来表示一天中在干什么事情。 ## UML设计: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54593ddc27.jpg) ## 编程实现及执行结果: ~~~ #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!** **请按任意键继续. . .**
';