一.狀態模式的定義:狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。
二.狀態模式的意圖:允許一個對象在其內部狀態改變時改變它的行爲。
三.狀態模式的適用場景:
1.一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲。
2.一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。
四.狀態模式的實現:
/// <summary>
/// 定義接口,封裝Context對象在特定狀態下的行爲
/// </summary>
public abstract class AbstractState
{
public abstract void handle(Context context);
}
/// <summary>
/// 具體A狀態下的對於的行爲
/// </summary>
public class ConcreteStateA:AbstractState
{
public override void handle(Context context)
{
Console.WriteLine("當前狀態:{0}",this.GetType().ToString());
//改變狀態
context.State = new ContextStateB();
}
}
/// <summary>
/// 具體B狀態下的對於的行爲
/// </summary>
public class ContextStateB:AbstractState
{
public override void handle(Context context)
{
Console.WriteLine("當前狀態:{0}",this.GetType().ToString());
//改變狀態爲C
context.State = new ContextStateC();
}
}
/// <summary>
/// 具體C狀態下的對於的行爲
/// </summary>
public class ContextStateC:AbstractState
{
public override void handle(Context context)
{
Console.WriteLine("當前狀態:{0}", this.GetType().ToString());
//改變狀態爲A
context.State = new ConcreteStateA();
}
}
public class Context
{
//Context 類需要維護一個ConcreteState 的實例,這個具體狀態類的實例給出了此環境下的對象的現有狀態。
public AbstractState State { get; set; }
public Context(AbstractState state)
{
this.State = state;
}
public void Request()
{
State.handle(this);
}
}
/// <summary>
/// C#設計模式-狀態模式
/// </summary>
class Program
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());
c.Request();//在 ConcreteStateA 中,我將 Context 的狀態切換回 ContextStateB ,
c.Request();//而 ContextStateB 中,我將 Context 的狀態切換回 ContextStateC,
c.Request();//而 ContextStateC 中,我將 Context 的狀態切換回 ConcreteStateA,
c.Request();//這樣便實現了 Context 在 A , B ,C 這三種狀態中循環的切換。
}
}
五.總結:
在一些情況下,一個對象的行爲取決於一個或者是多個動態變化的屬性,這些的屬性就叫做狀態,擁有這些屬性的對象稱爲狀態對象,這些對象的狀態是從事先定義好的一系列值中取出的,當一個這樣的對象與外部事件產生互動時,其內部狀態就會改變,從而使得系統行爲也隨之改變。狀態模式把所研究的對象的行爲包裝在不同的狀態對象裏,
每一個狀態對象都屬於一個抽象狀態類的子類,狀態模式的意圖是讓一個對象在其內部狀態發生改變時其行爲也隨之改變。