設計模式學習四 狀態模式

2021-08-10 07:55:32 字數 2476 閱讀 6172

一、什麼是狀態模式

定義:允許物件在內部狀態改變時改變它的行為,物件看起來好像改變了它的類

二、什麼時候用狀態模式?

當控制乙個物件狀態轉換的條件表示式過於複雜時,使用狀態模式。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。(避免了寫很多的if。。。。else)

三、狀態模式構成

context上下文:定義乙個客戶端需要的介面,維護乙個具體狀態角色的例項並將所有動作交由當前狀態物件處理。

state:乙個介面,用於定義與context行為相關的特定狀態

concretestate:具體的某個狀態

四、舉個例子

一家公司發明了一款糖果機,需要你設計乙個程式來控制糖果機的執行。初始狀態下:糖果機中沒有任何糖果,當有人投入硬幣後,可以選擇按鈕以此來獲得糖果,或者選擇退錢按鈕以此來退出錢。如果當前選擇了獲取糖果,糖果機中吐出乙個糖果,當糖果機中的糖果數量為0時候,糖果機進入停運狀態。

分析:這其中涉及糖果機狀態的轉換:

起初:糖果機為未支付狀態(nopayment)—(支付硬幣)—>已支付狀態—(按吐糖果按鈕)—>售出糖果—[(如果糖果數量為0)—>停運狀態,],[(如果不為0)->未支付狀態] 

也可以是:未支付狀態(nopayment)—(支付硬幣)—>已支付狀態—(退錢)—>未支付狀態

這裡面涉及四個狀態:未支付狀態,以支付狀態,**糖果狀態,停運狀態

動作:投幣,按吐糖果按鈕,退錢,發放糖果

class sugermachine

public void payment()

public void ejectmeney()

public void trunmoney()

public void setstate(state state)

public state getnopaymentstate()

public state getoutagestate()

public state getsoldstate()

public state getpaymentstate()

public int getcount()

public void removesuger()

}/**

* 抽象狀態

*/inte***ce state

/** * 以下為具體的四個狀態

*/class nopaymentstate implements state

@override

public void payment()

@override

public void ejectmoney()

@override

public void turnbutton()

@override

public void grantsuger()

}class paymentstate implements state

@override

public void payment()

@override

public void ejectmoney()

@override

public void turnbutton()

@override

public void grantsuger()

}class soldstate implements state

@override

public void payment()

@override

public void ejectmoney()

@override

public void turnbutton()

@override

public void grantsuger() else

}}class outagestate implements state

@override

public void payment()

@override

public void ejectmoney()

@override

public void turnbutton()

@override

public void grantsuger()

}public class state1test

}

輸出:支付成功,繼續操作

退錢成功,返回未支付狀態

支付成功,繼續操作

正在處理

給你,糖果~~

五、總結:

通過狀態模式,在擴充套件新功能的時候,只需要新增新的狀態類即可,實現了對擴充套件開放,對修改關閉的原則。

將各種狀態的轉換放在子類中實現,減少了互相的依賴。但造成很多子類的生成。

學習設計模式 狀態模式

說明 定義 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。該模式適用於那些複雜的條件不一樣,執行不一樣的場景,當然簡單的情況,直接用if else處理就可以了。需求 員工加班,不同的時間,寫程式的效率不一樣。解決方式 a.定義乙個狀態抽象類並定義乙個處理方法 b.根據不同狀...

設計模式學習 狀態模式

一般玩家角色會有很多狀態行為,並且多個狀態會在不同情況下進行轉換。一般狀態很少很簡單的化,可以利用switch 羅列狀態,類似於下面實現 for 但是這種方式會隨著狀態增加,耦合度不斷增加,不適應 後期修改。狀態模式就是就是單獨將狀態看成乙個個狀態類,每種狀態都是自己需要改變的資料和邏輯行為 pra...

設計模式學習筆記 狀態模式

定義 當乙個物件內在的狀態改變時,允許其改變行為,這個物件看起來像是改變了其類。狀態模式不太好理解,我現在還沒有完全理解,這個模式給我的第一印象就是比較亂,給我的感覺好像是兩個類互相依賴,呼叫 的方法,呼叫 的方法,弄的好亂,所以這個狀態模式就不用通用類圖去描述了,那樣會不知所云,還是舉乙個實際的例...