為啥第2個說狀態(tài)模式呢纵菌,說是這兩種模式在使用結(jié)構(gòu)上有點(diǎn)相似,不過休涤,實(shí)際上也的確是這樣的咱圆,呵呵,下面細(xì)說功氨。
1. 定義
整個對象的行為序苏,基于它的狀態(tài)變化,各個狀態(tài)之間可以動態(tài)切換捷凄,且狀態(tài)切換時忱详,對象內(nèi)部還有一些其他邏輯的變化。
2. 優(yōu)點(diǎn)
1)代碼結(jié)構(gòu)清晰:原本可能所有狀態(tài)的邏輯纵势,都集中或是分散在單個類里踱阿,真正去理解單個狀態(tài)的行為動作時管钳,會比較繁雜一些
2)將各個狀態(tài)獨(dú)立出來后钦铁,方便后續(xù)理解和維護(hù)
3. 缺點(diǎn)
1)會增加系統(tǒng)的類和實(shí)例的數(shù)量
2)單獨(dú)抽出狀態(tài)類后,可能會增加系統(tǒng)開發(fā)的復(fù)雜度
3)不是完全支持開閉原則才漆,添加新狀態(tài)牛曹,并切換狀態(tài)時,需要調(diào)整原有代碼
4. 結(jié)構(gòu)
- 抽象狀態(tài)類: 定義一個接口醇滥,用以封裝各個狀態(tài)下的特定行為
- 具體狀態(tài):實(shí)現(xiàn)抽象狀態(tài)所對應(yīng)的行為黎比,并在滿足條件的情況下切換狀態(tài)
- 環(huán)境類:定義相關(guān)業(yè)務(wù)接口,并維護(hù)一個狀態(tài)引用
5. 實(shí)現(xiàn)
媽媽做飯的狀態(tài)可能是多種多樣的鸳玩,分開心的時候阅虫,生氣的時候,呵呵不跟。
package pattern.state;
//做飯狀態(tài)
interface CookState {
public void cook(Context context);
}
//開心做飯狀態(tài)
class HappyCookState implements CookState {
@Override
public void cook(Context context) {
String content = context.getContent();
if(content.equals("我不喜歡吃蔬菜")){
System.out.println("不喜歡吃颓帝,不能說,媽媽要生氣了");
context.setCookState(new AngryCookState());
}
}
}
//生氣做飯狀態(tài)
class AngryCookState implements CookState {
@Override
public void cook(Context context) {
String content = context.getContent();
if(content.equals("你好漂亮")){
System.out.println("媽媽開心了,說不定购城,還加個菜吕座,太棒了!");
context.setCookState(new HappyCookState());
}
}
}
//環(huán)境
class Context {
private CookState cookState; //保留的一個狀態(tài)引用
private String content; //和媽媽交流的內(nèi)容
public Context(){
this.cookState = new HappyCookState();
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public CookState getCookState() {
return cookState;
}
public void setCookState(CookState cookState) {
this.cookState = cookState;
}
//接口外部請求
public void talkHandler(String content){
this.content = content;
cookState.cook(this);
}
}
public class StateTest {
public static void main(String[] args) {
Context context = new Context();
context.talkHandler("我不喜歡吃蔬菜");
context.talkHandler("你好漂亮");
}
}
//不喜歡吃瘪板,不能說吴趴,媽媽要生氣了
//媽媽開心了,說不定侮攀,還加個菜锣枝,太棒了!