結合項目實例 回顧傳統設計模式(十)狀態模式
2011-10-07 09:34 熬夜的蟲子 閱讀(651) 評論(0) 收藏 舉報談到狀態模式我們在這里所談論的是一個通用的技巧:如何對對象內的狀態建模----通過創建一個實例變量來持有狀態值,并在方法內書寫條件代碼來處理不同狀態。我們要把一個狀態的所有行為放在一個類中。這么一來我們將行為局部化了,并使得事情更容易改變和理解。
蟲子還是拿訂單系統來說事了
/// <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
{
Order order;
public Pendingsate(Order order)
{
this.order = order;
}
public void CheckCart()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void CheckAcount()
{
Console.WriteLine("訂單進入待審核狀態");
order.setState(order.getPendingsate());
}
public void OrderSumbit()
{
Console.WriteLine("訂單進入提交狀態");
order.setState(order.getsubmittedsate());
}
}
public class submittedsate : SimpleState
{
Order order;
public submittedsate(Order order)
{
this.order = order;
}
public void CheckCart()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void CheckAcount()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void OrderSumbit()
{
Console.WriteLine("訂單進入提交狀態");
order.setState(order.getsubmittedsate());
}
}
/// 狀態接口
/// </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
{
Order order;
public Pendingsate(Order order)
{
this.order = order;
}
public void CheckCart()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void CheckAcount()
{
Console.WriteLine("訂單進入待審核狀態");
order.setState(order.getPendingsate());
}
public void OrderSumbit()
{
Console.WriteLine("訂單進入提交狀態");
order.setState(order.getsubmittedsate());
}
}
public class submittedsate : SimpleState
{
Order order;
public submittedsate(Order order)
{
this.order = order;
}
public void CheckCart()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void CheckAcount()
{
Console.WriteLine("該狀態不能進入此步驟");
}
public void OrderSumbit()
{
Console.WriteLine("訂單進入提交狀態");
order.setState(order.getsubmittedsate());
}
}
總結:狀態模式允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。因為這個模式將狀態封裝成獨立的類,并將動作委托到代表當前狀態的對象,我們知道行為會隨著內部狀態改變而改變。從客戶的視角來看,如果你使用的對象能夠完全改變它的行為,那么你會覺得,這個對象實際上市用別的類實例化而來的。然而,實際上,我們是在使用組合通過簡單引用不同的狀態對象來造成類改變的假象。
![]() |
原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網安備 33010602011771號