設計模式中狀態模式是一個比較實用的設計模式,特別在流程應用中使用。
有的時候比如流程、工作流等我們需要對內部狀態發生改變,你只需要改變這個對象的行爲。狀態模式就是這樣使用的。你也可以創建不同的類來代表不同的狀態和功能。不過這些類需要繼承一個抽象類或者實現一個接口。使用狀態模式,我們可以通過在運行時傳遞對象不同的狀態子類,來改變對象狀態。好處是我們可以清晰的剝離不同的狀態子類,壞處是類的數量開始膨脹。
接下來我們看個例子吧。
訂單狀態接口: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!
上面就是一個簡單的狀態模式。優點狀態和行爲剝離。中間增加狀態只要實現狀態接口。缺點是:類會隨着狀態的增多,不斷的膨脹。