狀態(tài)( State )模式:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。
適用性:
-
一個對象的行為取決于它的狀態(tài), 并且它必須在運行時刻根據(jù)狀態(tài)改變它的行為。
-
一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態(tài)。這個狀態(tài)通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據(jù)對象自身的情況將對象的狀態(tài)作為一個對象,這一對象可以不依賴于其他對象而獨立變化。
所涉及的角色:
抽象狀態(tài) (State) 角色:定義一個接口,用以封裝對象的一個特定狀態(tài)所對應的形為。
具體狀態(tài) (Concrete State) 角色:每一個具體狀態(tài)類都實現(xiàn)環(huán)境( Context )的一個狀態(tài)所對應的行為。
環(huán)境(
Context
)角色:定義客戶端所感興趣的接口,并且保留一個具體狀態(tài)類的實例。這個具體狀態(tài)類的實例給出些環(huán)境對象的現(xiàn)有狀態(tài)。
一個簡單的例子:
抽象狀態(tài)State類








具體狀態(tài)類ConcreteStateA和ConcreteStateB:
























環(huán)境Context類








































狀態(tài)模式與策略模式的區(qū)別:
兩個模式很容易混淆,區(qū)別兩者的一個方法是考察環(huán)境角色是否有明顯的狀態(tài)和狀態(tài)過渡。如果環(huán)境角色只有一個狀態(tài),那么就應當使用策略模式。策略模式的特點:一旦環(huán)境角色選擇了一個具體的策略類,那么在整個環(huán)境類的生命周期里它都不會改變這個具體策略類。而狀態(tài)模式則適用另一情況,即環(huán)境角色有明顯的狀態(tài)轉移。在環(huán)境類的生命周期里面,會有幾個不同的狀態(tài)被使用。
另外一個微妙的區(qū)別在于策略模式的環(huán)境自己選擇一個具體的策略類,而狀態(tài)模式的環(huán)境類是被外在原因放進一個具體的狀態(tài)中。
策略模式所選擇的策略類往往不明顯的告訴客戶端它所選擇的具體策略類,而狀態(tài)模式則相反,環(huán)境角色所處的狀態(tài)是明顯告訴客戶端的。
參考資料:《java與模式》
《設計模式速查手冊》
http://blog.csdn.net/qutr/archive/2006/08/01/1007617.aspx