設計模式之狀態模式

設計模式中狀態模式是一個比較實用的設計模式,特別在流程應用中使用。

有的時候比如流程、工作流等我們需要對內部狀態發生改變,你只需要改變這個對象的行爲。狀態模式就是這樣使用的。你也可以創建不同的類來代表不同的狀態和功能。不過這些類需要繼承一個抽象類或者實現一個接口。使用狀態模式,我們可以通過在運行時傳遞對象不同的狀態子類,來改變對象狀態。好處是我們可以清晰的剝離不同的狀態子類,壞處是類的數量開始膨脹。

接下來我們看個例子吧。

訂單狀態接口:OrderState

package cn.xiaolin;

public interface OrderState {
	public void setOrderState(StateContext context);
}

開始狀態類:OrderBeginState

package cn.xiaolin;

public class OrderBeginState implements OrderState {
	@Override
	public void setOrderState(StateContext context) {
		System.out.println("Current State Beigin!");
		context.setOrderState(new OrderProcessState());
	}

}

處理狀態類:OrderProcessState

package cn.xiaolin;

public class OrderProcessState implements OrderState {

	@Override
	public void setOrderState(StateContext context) {
		System.out.println("Current State Process!");
		context.setOrderState(new OrderPayedState());

	}

}

支付狀態類:OrderPayedState

package cn.xiaolin;

public class OrderPayedState implements OrderState {

	@Override
	public void setOrderState(StateContext context) {
		System.out.println("Current State Payed!");
		context.setOrderState(new OrderFinishState());
	}

}

完成狀態類:OrderFinishState

package cn.xiaolin;

public class OrderFinishState implements OrderState {

	@Override
	public void setOrderState(StateContext context) {
		System.out.println("Current State Finish!");
		context.setOrderState(null);
	}

}

上下狀態處理類:StateContext

package cn.xiaolin;

public class StateContext {
	private OrderState state;

	public StateContext() {
		state = new OrderBeginState();
	}

	public void setOrderState(OrderState state) {
		this.state = state;
	}

	public void getCurrentState() {
		state.setOrderState(this);
	}
}

最後測試類:Test

package cn.xiaolin;

public class Test {
	public static void main(String[] args) {
		StateContext context = new StateContext();
		context.getCurrentState();
		context.getCurrentState();
		context.getCurrentState();
		context.getCurrentState();
	}
}
輸出結果:
Current State Beigin!
Current State Process!
Current State Payed!
Current State Finish!


上面就是一個簡單的狀態模式。優點狀態和行爲剝離。中間增加狀態只要實現狀態接口。缺點是:類會隨着狀態的增多,不斷的膨脹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章