談到狀态模式我們在這裡所談論的是一個通用的技巧:如何對對象内的狀态模組化----通過建立一個執行個體變量來持有狀态值,并在方法内書寫條件代碼來處理不同狀态。我們要把一個狀态的所有行為放在一個類中。這麼一來我們将行為局部化了,并使得事情更容易改變和了解。
蟲子還是拿訂單系統來說事了
/// <summary>
/// 狀态接口
/// </summary>
public interface SimpleState
{
//檢查購物車
void CheckCart();
//檢查賬号
void CheckAcount();
//送出訂單
void OrderSumbit();
}
public class Order
//初始狀态
SimpleState initsate;
//待稽核狀态
SimpleState Pendingsate;
//送出後狀态
SimpleState submittedsate;
public Order()
{
initsate = new InitState(this);
Pendingsate = new Pendingsate(this);
submittedsate = new submittedsate(this);
}
private SimpleState state;
public void setState(SimpleState state)
this.state = state;
public SimpleState getInitState()
return initsate;
public SimpleState getPendingsate()
return Pendingsate;
public SimpleState getsubmittedsate()
return submittedsate;
public class InitState : SimpleState
Order order;
public InitState(Order order)
this.order = order;
public void CheckCart()
Console.WriteLine("訂單進入初始狀态");
order.setState(order.getInitState());
public void CheckAcount()
Console.WriteLine("訂單進入待稽核狀态");
order.setState(order.getPendingsate());
public void OrderSumbit()
Console.WriteLine("該狀态不能進入此步驟");
public class Pendingsate : SimpleState
public Pendingsate(Order order)
Console.WriteLine("該狀态不能進入此步驟");
Console.WriteLine("訂單進入送出狀态");
order.setState(order.getsubmittedsate());
public class submittedsate : SimpleState
public submittedsate(Order order)
Console.WriteLine("該狀态不能進入此步驟");
總結:狀态模式允許對象在内部狀态改變時改變它的行為,對象看起來好像修改了它的類。因為這個模式将狀态封裝成獨立的類,并将動作委托到代表目前狀态的對象,我們知道行為會随着内部狀态改變而改變。從客戶的視角來看,如果你使用的對象能夠完全改變它的行為,那麼你會覺得,這個對象實際上市用别的類執行個體化而來的。然而,實際上,我們是在使用組合通過簡單引用不同的狀态對象來造成類改變的假象。
本文轉自 熬夜的蟲子 51CTO部落格,原文連結:http://blog.51cto.com/dubing/712417