設計模式之狀態模式(C 版)

2021-10-03 17:42:41 字數 1617 閱讀 8456

乙個人狀態的變化

uml圖

總結狀態在生活和工作中無處不在,比如乙個人有開心、傷心、工作中、睡眠中等不同的狀態,一張訂單有初始化、待審批、已審批等不同狀態。

我們先來講一下什麼是狀態模式。狀態模式的定義是,當乙個物件的內部狀態改變時,其行為也隨之改變,這個物件看起來像是改變了其類。

比如乙個人,從心平氣和的狀態變到憤怒的狀態下(狀態的改變),簡直判若兩人(行為也隨之改變)。

下面我們就用**來模擬一下乙個人從心平氣和的狀態變到憤怒狀態的不同行為變化的實現。

我們先看一下最最普通沒有用設計模式的寫法。

public

class

person

// 對於不同狀態的反應

public

void

reaction()

}}

接著,我們先激怒這個人(狀態的變化),等他發洩(狀態變化的行為)完之後,又回到平靜(狀態變化)。

class

program

}

上面的**使用switch case來判斷不同狀態,然後執行對應的行為,這裡一旦狀態變多,或者某個狀態下,其行為很複雜的時候,會變得很難維護。

接下來我們用狀態模式來改造一下。

// 描述狀態的基類

public

abstract

class

state

// 心平氣和狀態類

public

class

peacefulstate

:state

public

override

void

reaction()

}// 生氣狀態類

public

class

angrystate

:state

public

override

void

reaction()

}

下面看一下如何在狀態間切換,並且執行對應狀態的行為。

static

void

main

(string

args)

使用了狀態模式的**,只需要通過繼承state基類,便可以十分方便地拓展person能夠擁有的狀態和對應的行為,完全不需要使用switch case來實現。

同時每個狀態都儲存有這個狀態的持有者(person),在對應狀態的行為執行完之後,可以利用setstate方法切換狀態持有者的狀態,比如這裡,person生氣發洩完之後,狀態直接切換為peacefulstate。

這樣的**,看起來是不是比之前的要清晰很多,而且更容易拓展呢?

狀態模式將物件的狀態判斷邏輯和行為轉移到一系列表示不同狀態的類中,使複雜的判斷邏輯簡單化,更便於狀態的拓展和管理。說白了,就是可以省去很長的狀態條件的判斷。

當乙個物件的行為依賴於狀態的切換而有所不同的時候,就可以考慮狀態模式了。比如訂單的狀態改變,怪物的狀態改變等等,都可以使用狀態模式來優化。

C 設計模式之狀態模式

狀態模式,當乙個物件的內在狀態改變時,語序改變其行為,這個物件看起來像是改變了其類 include using namespace std class state class forenoon class noon class afternonn class evening class gohome...

(C )設計模式之狀態模式

1.狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起像是改變了其類。狀態模式主要解決的是當控制乙個物件的狀態轉換的條件表示式過於複雜時,可以將狀態的判斷邏輯轉移到表示不同狀態的一系列類中,將複雜的判斷邏輯簡化。將特定與狀態相關的行為區域性化,並且將不同狀態的行為分割開來。當乙個物件的...

c 設計模式之狀態模式

狀態模式思想 定義乙個狀態類,裡面可以實現多種狀態的轉換,每個狀態由乙個單獨類來判斷和實現,物件裡有設定更新狀態的方法,獲得當前狀態的方法來跳轉到其他狀態類的方法中 因為setstate的時候把state的狀態變為另乙個子類,然後呼叫子類自己的判斷方法,滿足條件,則用new乙個新狀態代替原來狀態來跳...