目錄
- 一、應用背景
- 二、狀態模式
- 三、通用設計類圖
- 四、實現
- 4.1 設計類圖
- 4.2 狀態轉換圖
- 4.3 代碼實現
一、應用背景
- 某對象發生變化時,其所能做的操作也隨之變化。
- 應用程序的可維護性和重用性差
- 代碼的邏輯較復雜
二、狀態模式
2.1 解決的問題
2.2 角色
- 環境類(Context):客戶使用的對象料。維護一個State子類的實例,這個實例定義當前狀態
- 抽象狀態類(State):定義一個抽象以封裝瑟Context的一個特定狀態相關的行為
- 具體狀態類(ConcreteState):每一子類實現一個與Context的一個狀態相關的行為
2.3 實現步驟
- 定義抽象狀態類,實現當前系統的真實狀態繼承自此抽象狀態類
- 定義Context類,具有狀態的類,其中包含抽象狀態類的對象
- 定義具體狀態類,實現當前系統的真實狀態類
- 當Context類執行某個接口的方法時,去調用真實狀態類的實現方法
- 當Context類修改狀態時,修改Context類的真實狀態對象
三、通用設計類圖

- Context:上下文/環境類,即狀態的擁有者
- State:抽取出的抽象狀態類,里面規定了該類擁有的行
- Concrete StateA:具體的狀態類
四、實現
4.1 設計類圖

- 房間類:環境類,狀態擁有者
- 房間狀態類:抽象類,定義房間的狀態信息
- xxx狀態類:各種不同的房間狀態信息,繼承自房間狀態類
4.2 狀態轉換圖

4.3 代碼實現
#include <iostream>class Room;class State
{
public:virtual std::string getState() = 0;virtual void book(Room* room) = 0;virtual void checkin(Room* room) = 0;virtual void unbook(Room* room) = 0;virtual void checkout(Room* room) = 0;
};class Room
{
protected:State* s;public:std::string getState(){return s->getState();}void setState(State* a){s = a;}void book(){s->book(this);}void checkin(){s->checkin(this);}void unbook(){s->unbook(this);}void checkout(){s->checkout(this);}
};class FreeState : public State
{
public:std::string getState() override{return "當前為空閑狀態";}void book(Room* room) override;void checkin(Room* room) override;void unbook(Room* room) override{std::cout << "當前為空閑狀態,無法進行取消預定操作" << std::endl;}void checkout(Room* room) override{std::cout << "當前為空閑狀態,無法進行退房操作" << std::endl;}
};class BookState : public State
{
public:std::string getState() override{return "當前為預定狀態";}void book(Room* room) override{std::cout << "當前已經是預定狀態,無須重復預訂" << std::endl;}void checkin(Room* room) override;void unbook(Room* room) override;void checkout(Room* room) override{std::cout << "當前是預定狀態,無須退房" << std::endl;}
};class CheckinState : public State
{
public:std::string getState() override{return "當前為入住狀態";}void book(Room* room) override{std::cout << "當前是入住狀態,無法預定" << std::endl;}void checkin(Room* room) override{std::cout << "當前是入住狀態,無須重復入住" << std::endl;}void unbook(Room* room) override{std::cout << "當前是入住狀態,無法取消預定" << std::endl;}void checkout(Room* room) override{std::cout << "退房操作" << std::endl;room->setState(new FreeState());}
};void FreeState::book(Room* room)
{std::cout << "預訂操作" << std::endl;room->setState(new BookState());
}void FreeState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::unbook(Room* room)
{std::cout << "取消預訂操作" << std::endl;room->setState(new FreeState());
}int main()
{Room* r = new Room();State* s = new FreeState();r->setState(s);std::cout << "=============================" << std::endl;std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkin();std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkout();r->book();r->checkout();std::cout << r->getState() << std::endl;return 0;
}