狀態模式:當物件狀態改變時行為也隨之改變,看起來就像是這個類發生了改變。
首先物件有狀態,行為由狀態決定。
假設現在有乙個遊戲角色,有正常狀態、加速狀態、減速狀態、眩暈狀態。
遊戲角色不同狀態下的行為是不同的,減速跑的慢一些、眩暈不能跑。
我們將遊戲角色轉換為**,先看不使用狀態模式的情況。
遊戲角色類
publicclass
hero
public
void setstate(int
state)
public
void
run()
else
if(state ==speed_up)
else
if(state ==speed_down)
else
if(state ==swim)
}}
main
publicclass
main
}
執行結果:正常狀態
加速狀態
眩暈狀態
減速狀態
遊戲角色中有狀態,執行run方法時會根據狀態列印出不用的結果,即物件狀態的改變也會造成行為的改變。
這樣實現也可以,但如果後續分支狀態過多,需要大量的if else,而且hero的狀態只物件hero有效,怪獸同樣有這些狀態,
這些狀態無法復用。
這時我們就可以採用狀態模式
首先需要將狀態抽取出來,每乙個狀態對應乙個狀態類
狀態介面
publicinte***ce
state
加速狀態
publicclass speedupstate implements
state
@override
public
string tostring()
}
減速狀態
publicclass speeddownstate implements
state
@override
public
string tostring()
}
眩暈狀態
publicclass swimstate implements
state
@override
public
string tostring()
}
正常狀態
publicclass commonstate implements
state
@override
public
string tostring()
}
每乙個狀態對應乙個狀態類,當英雄狀態需要傳送變化時,只需建立狀態類,然後將heroz作為引數,呼叫狀態類的change方法。
change方法會將當前狀態物件設定到hero中的state屬性,後續直接獲取英雄狀態即可。
main
publicclass
main
}
執行結果:正常狀態
加速狀態
眩暈狀態
減速狀態
後續還有新的狀態只需新增狀態類即可,而且可以進一步抽象,使heor類和怪獸類實現同乙個介面,這樣這些狀態對於hero和怪獸都適用。
設計模式 狀態模式
狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...
設計模式 狀態模式
1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...
設計模式 狀態模式
描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...