設計模式之狀態模式 看看狀態怎麼樣?

2021-10-03 15:17:51 字數 2943 閱讀 8168

四、狀態模式的示例

五、狀態模式的優缺點

狀態模式屬於行為型設計模式,它通過改變物件的內部狀態而改變物件的行為,這個物件表現得就好像修改了它的類一樣。

狀態模式主要解決:當控制乙個物件狀態轉換的條件表示式過於複雜時,把狀態的判斷邏輯轉移到表現不同狀態的一系列類當中,從而使複雜的判斷邏輯簡單化。

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的乙個特...