1. 程式人生 > 其它 >06-09-設計模式 狀態模式

06-09-設計模式 狀態模式

APP抽獎活動問題

請編寫程式完成APP抽獎活動具體要求如下:

1)假如每參加一次這個活動要扣除使用者50積分,中獎概率是10%

2)獎品數量固定,抽完就不能抽獎

3)活動有四個狀態:可以抽獎、不能抽獎、發放獎品和獎品領完

4)活動的四個狀態轉換關係圖(右圖)

狀態模式

基本介紹

1)狀態模式(StatePattern):它主要用來解決物件在多種狀態轉換時,需要對外輸出不同的行為的問題。狀態和行為是一一對應的,狀態之間可以相互轉換

2)當一個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類

類圖

對原理類圖的說明-即(狀態模式的角色及職責)

1)Context類為環境角色,用於維護State例項,這個例項定義當前狀態

2)State是抽象狀態角色,定義一個介面封裝與Context的一個特點介面相關行為

3)ConcreteState具體的狀態角色,每個子類實現一個與Context的一個狀態相關行為

狀態模式解決

-定義出一個介面叫狀態介面,每個狀態都實現它。

-介面有扣除積分方法、抽獎方法、發放獎品方法

狀態模式的注意事項和細節

1)程式碼有很強的可讀性。狀態模式將每個狀態的行為封裝到對應的一個類中

2)方便維護。將容易產生問題的if-else語句刪除了,如果把每個狀態的行為都放到一個類中,每次呼叫方法時都要判斷當前是什麼狀態,不但會產出很多if-else語句,而且容易出錯

3)符合“開閉原則”。容易增刪狀態

4)會產生很多類。每個狀態都要一個對應的類,當狀態過多時會產生很多類,加大維護難度

5)應用場景:當一個事件或者物件有很多種狀態,狀態之間會相互轉換,對不同的狀態要求有不同的行為的時候,可以考慮使用狀態模式