狀態模式,又稱狀態物件模式(pattern of objects for states),狀態模式是物件的行為模式。狀態模式允許乙個物件在其內部狀態改變的時候改變其行為。這個物件看上去就像是改變了它的類一樣。
環境(context)角色,也成上下文:定義客戶端所感興趣的介面,並且保留乙個具體狀態類的例項。這個具體狀態類的例項給出此環境物件的現有狀態。
抽象狀態(state)角色:定義乙個介面,用以封裝環境(context)物件的乙個特定的狀態所對應的行為。
具體狀態(concretestate)角色:每乙個具體狀態類都實現了環境(context)的乙個狀態所對應的行為。
狀態介面
public inte***ce status
狀態1
public class status1 implements status
@override
public void action()
}
狀態2
public class status2 implements status
@override
public void action()
}
狀態3
public class status3 implements status
@override
public void action()
}
全域性物件(持有狀態)
public class context
public status getstatus()
public void setstatus(status status)
public status1 getstatus1()
public status2 getstatus2()
public void execute()
public status3 getstatus3()
}
測試類
public class statustest
}
效果:
狀態1執行完畢,變成狀態2
狀態2執行完畢,變成狀態3
狀態3執行完畢,變回狀態1
上圖是比較粗略簡單的狀態,只是簡單的體現了狀態的轉換,狀態物件的封裝等特點;
狀態模式的主要優點在於封裝了轉換規則,並列舉可能的狀態,它將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為,還可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數;其缺點在於使用狀態模式會增加系統類和物件的個數,且狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂,對於可以切換狀態的狀態模式不滿足「開閉原則」的要求。
新增新的狀態或策略都很容易,而且不需要修改使用它們的context物件。
它們都讓你的**符合ocp原則。在狀態模式和策略模式中,context物件對修改是關閉的,新增新的狀態或策略,都不需要修改context。
正如狀態模式中的context會有初始狀態一樣,策略模式同樣有預設策略。
狀態模式以不同的狀態封裝不同的行為,而策略模式以不同的策略封裝不同的行為。
它們都依賴子類去實現相關行為。
可參考
策略模式封裝了一組相關演算法,它允許client在執行時使用可互換的行為;狀態模式幫助乙個類在不同的狀態顯示不同的行為。(簡單的來理解策略模式是在同一時刻不同的行為,狀態模式是在不同時刻不同行為)
狀態模式封裝了物件的狀態,而策略模式封裝演算法或策略。因為狀態是跟物件密切相關的,它不能被重用;而通過從context中分離出策略或演算法,我們可以重用它們。(狀態物件中會持有乙個物件的引用,狀態只能被該物件使用)
在狀態模式中,每個狀態通過持有context的引用,來實現狀態轉移;但是每個策略都不持有context的引用,它們只是被context使用。(跟第二點類似)
狀態模式中很好的定義了狀態轉移的次序;而策略模式並無此需要:client可以自由的選擇任何策略。(狀態模式強調狀態的改變)
最後但最重要的乙個不同之處是,策略的改變由client完成;而狀態的改變,由context或狀態自己(具體策略在客戶端中實現並使用,但是具體的狀態在context執行某個方法或者其中乙個方法執行完畢之後自動轉換到另乙個狀態)
設計模式之狀態模式java 購物
1 定義狀態介面,也可以是抽象類abstract,這裡我喜歡用介面inte ce 購物介面 public inte ce ishopping 2 例項化具體的狀態,這裡我有兩個乙個是正常購物,乙個 購物 平常購物類實現購物介面 public class impnormalshopping imple...
java狀態模式
參考 狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。使用前提 狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。使用好處 將與特定狀態相關的行為區域性化,並且將不同狀...
java狀態模式
參考 狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。使用前提 狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。使用好處 將與特定狀態相關的行為區域性化,並且將不同狀...