四、狀態模式的示例
五、狀態模式的優缺點
狀態模式屬於行為型設計模式,它通過改變物件的內部狀態而改變物件的行為,這個物件表現得就好像修改了它的類一樣。
狀態模式主要解決:當控制乙個物件狀態轉換的條件表示式過於複雜時,把狀態的判斷邏輯轉移到表現不同狀態的一系列類當中,從而使複雜的判斷邏輯簡單化。
1、行為隨狀態改變而改變的場景。
2、條件和分支語句的替代者。
擁有乙個狀態型別的成員,以標識物件的當前狀態,並提供給客戶端呼叫的介面。
封裝與使用者物件的特定狀態相關行為的介面和方法。
實現抽象狀態類定義的介面和方法。
// statepattern.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include
#include
#define delete_ptr(p) }
using
namespace std;
// 根據時間點不同模仿乙個人吃早飯、午飯、晚飯的狀態,其他時間狀態都設定在工作
class
eatmeal
;//class morningtimestate;
//class noontimestate;
//class nighttimestate;
// 抽象狀態類(state)
class
timestate
;// 使用者物件(上下文環境)類(context)-去吃飯
class
eatmeal
~eatmeal()
void
changetimestate
(int timestate)
intgetcurtime()
void
settimestate
(timestate *pcurtimestate)
timestate *
gettimestate()
void
toeatmeal()
private
:int m_timestate;
timestate *m_curtimestate;};
// 具體狀態類(concretestate)-吃早飯
class
morningtimestate
:public timestate
virtual
void
toeatmeal
(eatmeal *peatmeal)
;private
:int m_timestate;};
// 具體狀態類(concretestate)-吃午飯
class
noontimestate
:public timestate
virtual
void
toeatmeal
(eatmeal *peatmeal)
;private
:int m_timestate;};
// 具體狀態類(concretestate)- 吃晚飯
class
nighttimestate
:public timestate
virtual
void
toeatmeal
(eatmeal *peatmeal)
;private
:int m_timestate;};
/*因為morningtimestate、noontimestate、nighttimestate三個類中互相呼叫了類中的方法,
即使前置宣告這三個類也不行,類的宣告和實現必須分離才行,不分離的話會提示「使用了未定義的型別錯誤」*/
void morningtimestate::
toeatmeal
(eatmeal *peatmeal)
else
if(peatmeal-
>
getcurtime()
>=
12&& peatmeal-
>
getcurtime()
<=13)
// 下乙個吃飯節點午飯
else
// 其他時間都在工作
}void noontimestate::
toeatmeal
(eatmeal *peatmeal)
else
if(peatmeal-
>
getcurtime()
>=
18&& peatmeal-
>
getcurtime()
<=20)
// 下乙個吃飯節點晚飯
else
// 其他時間都在工作
}void nighttimestate::
toeatmeal
(eatmeal *peatmeal)
else
if(peatmeal-
>
getcurtime()
>=
7&& peatmeal-
>
getcurtime()
<=8)
// 下乙個吃飯節點早飯
else
// 其他時間都在工作
}int
main()
1、把複雜的物件狀態判斷簡單化。
2、將所有與某個狀態有關的行為放到乙個類中,可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。
3、允許狀態轉換邏輯與狀態物件合成一體,從而簡化邏輯判斷。
4、多個環境物件可以共享乙個狀態物件,減少系統中物件的個數。
1、每增加一種狀態都會增加乙個類。
2、狀態模式的結構與實現都較為複雜。
3、耦合性強,增加新的狀態類需要修改負責狀態轉換的源**。
能力有限,如有錯誤,多多指教。。。
設計模式之狀態模式
一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...
設計模式之 狀態模式
gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...
設計模式之狀態模式
定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...