設計模式C 實現十二 狀態模式

2021-07-02 13:13:11 字數 1735 閱讀 6003

狀態模式(state):當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。

狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式國語複雜時的情況。把狀態的判斷邏輯轉移到不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。例如本文的例子,只要我們把時間輸入,就可以根據時間判斷使用哪個狀態,而不用我們在客戶端來判斷,客戶端看到的只是很簡單的**,我們把複雜的邏輯判斷轉移到後台,而後台可以判斷每個狀態的下乙個狀態。 

狀態模式的好處是將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。狀態模式通過把各種狀態轉移邏輯分布到具體的狀態類中,減少相互間的依賴。

使用場景:當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為,就可以考慮狀態模式。

#ifndef state_h

#define state_h

#include#includeusing namespace std;

class work;

class forenoonstate;

class noonstate;

class afternoonstate;

class eveningstate;

class reststate;

class sleepingstate;

class state

virtual void writeprogram(work *w)

};class work

state * current;

double hour;

bool finish = false;

//(state * s):current(s) {}

work();

//work():current(new forenoonstate){}//此處會出現沒有合適預設建構函式可用的錯誤提示,因為雖然我們在之前宣告了forenoonstate類,但是沒有給出定義,所以無法構造

//但是可以在所有類宣告完畢後實現這個預設建構函式。

bool taskfinished()

void setstate(state * s)

void writeprogram() };

class reststate :public state

void writeprogram(work* k)

};class sleepingstate :public state

void writeprogram(work *k) };

class eveningstate :public state

void writeprogram(work *k)

else

else

} }};class afternoonstate :public state

void writeprogram(work *k) }

};class noonstate :public state

void writeprogram(work *k) }

};class forenoonstate :public state

void writeprogram(work *k) }

};work::work() :current(new forenoonstate){}

#endif

#include"state.h"

int main()

設計模式 十二 狀態模式 C

狀態模式 狀態模式允許乙個物件在其內部狀態改變的時候改變行為。在狀態模式 state pattern 中,類的行為是基於它的狀態改變的。這種型別的設計模式屬於行為型模式。設計的時候把狀態物件和目標物件分離。目標物件執行行為的時候,把目標物件傳遞給狀態物件a,如果滿足狀態a的條件,執行狀態a的方法,不...

設計模式實現(十二) 狀態模式 State

狀態模式 state 當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜的情況 也就是if過於多的情況 把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。當然,如果這個狀態判斷很簡單,那麼...

設計模式(十二 狀態模式

狀態模式,當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。1.如下 using system namespace state using system namespace state else using system namespace state else using s...