1.知識點
學習案例:http://www.cnblogs.com/ludashi/p/5443563.html
狀態模式:允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類
解析:這個模式將狀態封裝成獨立的類,并將動作委托到代表當前狀態的對象。例如,ATM機案例中,ATM類并沒有直接處理“存取操作”,而是通過不同的“狀態類”去處理,即委托“狀態類”處理具體事件。
2.狀態模式與策略模式
1.策略模式
允許對象能夠通過組合和委托來擁有不同的行為或算法。通常,我們把策略模式想成是除了繼承之外的一種彈性代替方式。如果你使用繼承定義了一個類的行為,你將被這個行為困住,甚至修改它會非常困難。而策略模式可以通過組合不同的對象來改變行為。
例如,你有一個可以實例化的鴨子類,需要實現呱呱叫行為。
1)使用繼承:每個鴨子類都需要實現一個呱呱叫的行為。如果有多個鴨子的行為是相同的,我們可以把相同的行為放在基類中,調用自身的行為時,先調用一下父類中的通用行為。如果某一類的行為發生了變化,我們需要把所有鴨子類中的行為都更改,這個工作量是非常巨大的。
2)使用策略模式,實現好一系列的呱呱叫行為,每個鴨子實例類根據需求調用具體的行為類。當有新的鴨子出現時,我們只要改變現有行為或添加新行為就好了。這也體現了針對接口編程,而不是針對實現編程。2.狀態模式
將一群行為封裝在不同的狀態對象類中,類的行為隨時可委托到那些狀態對象類的任一個。將具體行為封裝成接口類,把具體行為委托給接口類實現,這一點和策略模式是相似的。但是,狀態模式通過狀態決定了行為類的調用,狀態切換可以調用不同的行為,這些都是事先編碼決定好的。策略模式雖然也可以通過運行時決定策略的選擇,但那不是根據狀態對象決定的。
3.問答
1.狀態總是決定接下來的狀態是什么嗎?
并非如此。狀態類可以決定接下來的狀態,但是這會讓狀態類之間產生依賴。當狀態的轉換是固定的時候,適合這么做。我們也可以讓類本身去決定狀態的轉換。2.用戶能否直接和狀態交互?
不能,狀態是用在類中來代表它的內部狀態以及行為的,只有類才會對狀態提出請求。3.如果類有多個實例,這些實例之間的狀態可以共享嗎?
可以。但是唯一的前提是,你的狀態對象不能持有它們自己的內部狀態