## 模式定義
? ? ? 狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。
## 模式結構:

Context:
環境定義客戶感興趣的接口
維護一個ConcreteState子類的實例,這個實例定義當前狀態
State:
定義一個接口封裝與Context的一個特定狀態相關的行為
ConcreteState subclasses:
每一子類實現一個與Context的一個狀態相關的行為
## 舉例:
? ? ? 一個工人一天的時間分為上班,睡覺,干其他事情三個時間段。我們可以用狀態模式來表示一天中在干什么事情。
## UML設計:

## 編程實現及執行結果:
~~~
#include <iostream>
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!**
**請按任意鍵繼續. . .**