將事物的每個狀態的行為放入各自的類中,每個狀態實現自己的動作;
當事物發生動作時,通過動作委托到狀態類;
好處:
- 事物每個狀態的行為局部化到它自己的類中;
- 可將事物類中各種狀態剔除掉,利于維護;
- 狀態對 “修改關閉”,事物類,對擴展開放;
狀態模式的定義:
狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改他的類;
類圖
Paste_Image.png
- context上下文對象:用于一些內部狀態,分別用來表示上下文對象的各種狀態;
- State:所有具體狀態類的基類,State接口定義了所有具體狀態的共同接口;
這樣一來,context中的當前狀態之間就可以相互替換; - ConcreteStateA: 具體狀態類,處理來自Context中的請求,當context改變狀態時,實際上,調用的不同狀態對象中的方法,這樣就實現了 context 的狀態切換了;
與策略模式對比:
意圖不同
- 狀態模式,將一群行為封裝在狀態對象中,context的行為可隨時委托到一群狀態對象中的一個,隨著程序運行,當前狀態在狀態對象集合中游走改變,用來反映出context內部的狀態,這樣context的行為也跟著變化(因為context的行為通過狀態來表示了嘛),但context的客戶并不需要考慮context內部是如何工作的;
- 策略模式,客戶主動指定Context所要組合的策略對象是哪一個,對于context來說,通常只有一個最合適的策略對象;
一般下,我們把策略模式想象成 除了繼承之外的一種彈性替代方案;
我們把狀態模式想成是不用在context中放置許多條件判斷的替代方案;