狀態(tài)( State )模式:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。
適用性:
所涉及的角色:
抽象狀態(tài) (State) 角色:定義一個接口,用以封裝對象的一個特定狀態(tài)所對應(yīng)的形為。
具體狀態(tài) (Concrete State) 角色:每一個具體狀態(tài)類都實現(xiàn)環(huán)境( Context )的一個狀態(tài)所對應(yīng)的行為。
環(huán)境( Context )角色:定義客戶端所感興趣的接口,并且保留一個具體狀態(tài)類的實例。這個具體狀態(tài)類的實例給出些環(huán)境對象的現(xiàn)有狀態(tài)。一個簡單的例子:抽象狀態(tài)State類
具體狀態(tài)類ConcreteStateA和ConcreteStateB:
狀態(tài)模式與策略模式的區(qū)別:
兩個模式很容易混淆,區(qū)別兩者的一個方法是考察環(huán)境角色是否有明顯的狀態(tài)和狀態(tài)過渡。如果環(huán)境角色只有一個狀態(tài),那么就應(yīng)當(dāng)使用策略模式。策略模式的特點:一旦環(huán)境角色選擇了一個具體的策略類,那么在整個環(huán)境類的生命周期里它都不會改變這個具體策略類。而狀態(tài)模式則適用另一情況,即環(huán)境角色有明顯的狀態(tài)轉(zhuǎn)移。在環(huán)境類的生命周期里面,會有幾個不同的狀態(tài)被使用。
另外一個微妙的區(qū)別在于策略模式的環(huán)境自己選擇一個具體的策略類,而狀態(tài)模式的環(huán)境類是被外在原因放進一個具體的狀態(tài)中。
策略模式所選擇的策略類往往不明顯的告訴客戶端它所選擇的具體策略類,而狀態(tài)模式則相反,環(huán)境角色所處的狀態(tài)是明顯告訴客戶端的。參考資料:《java與模式》《設(shè)計模式速查手冊》http://blog.csdn.net/qutr/archive/2006/08/01/1007617.aspx