將事物的每個狀態(tài)的行為放入各自的類中灰粮,每個狀態(tài)實現(xiàn)自己的動作;
當(dāng)事物發(fā)生動作時忍坷,通過動作委托到狀態(tài)類粘舟;
好處:
- 事物每個狀態(tài)的行為局部化到它自己的類中熔脂;
- 可將事物類中各種狀態(tài)剔除掉,利于維護(hù)蓖乘;
- 狀態(tài)對 “修改關(guān)閉”锤悄,事物類,對擴(kuò)展開放嘉抒;
狀態(tài)模式的定義:
狀態(tài)模式允許對象在內(nèi)部狀態(tài)改變時改變它的行為零聚,對象看起來好像修改他的類;
類圖
- context上下文對象:用于一些內(nèi)部狀態(tài)些侍,分別用來表示上下文對象的各種狀態(tài)隶症;
- State:所有具體狀態(tài)類的基類,State接口定義了所有具體狀態(tài)的共同接口岗宣;
這樣一來蚂会,context中的當(dāng)前狀態(tài)之間就可以相互替換; - ConcreteStateA: 具體狀態(tài)類耗式,處理來自Context中的請求胁住,當(dāng)context改變狀態(tài)時,實際上刊咳,調(diào)用的不同狀態(tài)對象中的方法彪见,這樣就實現(xiàn)了 context 的狀態(tài)切換了;
與策略模式對比:
意圖不同
- 狀態(tài)模式娱挨,將一群行為封裝在狀態(tài)對象中余指,context的行為可隨時委托到一群狀態(tài)對象中的一個,隨著程序運行跷坝,當(dāng)前狀態(tài)在狀態(tài)對象集合中游走改變酵镜,用來反映出context內(nèi)部的狀態(tài),這樣context的行為也跟著變化(因為context的行為通過狀態(tài)來表示了嘛)柴钻,但context的客戶并不需要考慮context內(nèi)部是如何工作的淮韭;
- 策略模式,客戶主動指定Context所要組合的策略對象是哪一個贴届,對于context來說缸濒,通常只有一個最合適的策略對象;
一般下粱腻,我們把策略模式想象成 除了繼承之外的一種彈性替代方案庇配;
我們把狀態(tài)模式想成是不用在context中放置許多條件判斷的替代方案;