1. 程式人生 > >狀態模式

狀態模式

inline test names span closed nbsp 封裝 name com

允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它的類。

在state模式中我們將狀態邏輯和動作實現進行分離。當一個操作中要維護大量的 case 分支語句,並且這些分支依賴於對象的狀態。state模式將每一個分支都封裝到獨立的類中。

代碼:

技術分享
#include <iostream>
using namespace std;

#define CC_SAFE_DELETE(p) if ((p)) {delete (p); (p) = NULL;}

class Work;

class State
{
public:
    virtual ~State() {}
public: virtual void writeProgram(Work *w) = 0; }; // 上午工作狀態 class ForenoonState : public State { public: virtual void writeProgram(Work *w); }; // 中午工作狀態 class NoonState : public State { public: virtual void writeProgram(Work *w); }; // 下午工作狀態 class AfternoonState : public State { public:
virtual void writeProgram(Work *w); }; // 晚間工作狀態 class EveningState : public State { public: virtual void writeProgram(Work *w); }; // 睡眠狀態 class SleepingState : public State { public: virtual void writeProgram(Work *w); }; // 下班休息狀態 class RestState : public State { public: virtual void writeProgram(Work *w); };
class Work { public: Work() { _curState = new ForenoonState(); _taskFinished = false; } ~Work() { CC_SAFE_DELETE(_curState); } inline void setHour(int h){ _hour = h; } inline int getHour(){ return _hour; } inline bool getTaskFinished(){ return _taskFinished; } void setTaskFinished(bool finished = true){ _taskFinished = finished; } void changeState(State *s) { if (_curState != s) { CC_SAFE_DELETE(_curState); _curState = s; } } void writeProgram() { _curState->writeProgram(this); } private: int _hour; //時間 State *_curState; //工作狀態 bool _taskFinished; }; void ForenoonState::writeProgram(Work *w) { if (w->getHour() < 12) { cout << "當前時間: " << w->getHour() << "點 上午工作,精神百倍" << endl; } else { w->changeState(new NoonState()); w->writeProgram(); } } void NoonState::writeProgram(Work *w) { if (w->getHour() < 13) { cout << "當前時間: " << w->getHour() << "點 午休時間" << endl; } else { w->changeState(new AfternoonState()); w->writeProgram(); } } void AfternoonState::writeProgram(Work *w) { if (w->getHour() < 18) { cout << "當前時間: " << w->getHour() << "點 下午狀態不錯, 努力工作" << endl; } else { w->changeState(new EveningState()); w->writeProgram(); } } void EveningState::writeProgram(Work *w) { if (w->getTaskFinished()) { w->changeState(new RestState()); // 下班 w->writeProgram(); } else { if (w->getHour() < 22) { cout << "當前時間: " << w->getHour() << "點 加班哦, 疲憊至極" << endl; } else { w->changeState(new SleepingState()); w->writeProgram(); } } } void RestState::writeProgram(Work *w) { cout << "當前時間是: " << w->getHour() << "點 下班回家了" << endl; } void SleepingState::writeProgram(Work *w) { cout << "當前時間是: " << w->getHour() << "點, 不行了,睡覺了" << endl; } void test() { Work *w = new Work(); w->setHour(9); w->writeProgram(); w->setHour(10); w->writeProgram(); w->setHour(12); w->writeProgram(); w->setHour(14); w->writeProgram(); w->setHour(19); w->writeProgram(); //w->setTaskFinished(); w->setHour(20); w->writeProgram(); w->setHour(23); w->writeProgram(); } int main() { test(); cin.get(); return 0; }
View Code

效果:

技術分享

狀態模式