06-09-設計模式 狀態模式
阿新 • • 發佈:2022-05-28
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)應用場景:當一個事件或者物件有很多種狀態,狀態之間會相互轉換,對不同的狀態要求有不同的行為的時候,可以考慮使用狀態模式