狀態設計模式,即某個角色有多種狀態,需要在各個狀態切換時,使用這種狀態設計使代碼更加靈活,簡化了代碼的判斷邏輯,主要思路如下:
1.建立一個新的類來控制所有狀態的切換(Context),這個類中包含了:狀態屬性,控制狀態變換的方法,設置狀態的方法。
public class ConText
{
private State m_State;//狀態屬性
public void Request(int value)//控制狀態變換的方法
{
m_State.Handle(value);
}
public void SetState(State thsState)//設置狀態的方法
{
m_State = thsState;
}
}
2.建立一個總的狀態抽象類,所有狀態繼承于該類,該類包含了:控制狀態切換的字段,構造函數加上控制類作為參數,控制狀態變換的方法。
public abstract class State
{
protected ConText m_Context = null;//控制狀態切換的字段
public State(ConText theConText)//構造函數
{
m_Context = theConText;
}
public abstract void Handle(int vaule);//控制狀態變換
}
3.子類創建(不同的狀態,這個以3個狀態為例),狀態切換有A->B->C:
public class StateA : State
{
public StateA(ConText thsConText) : base(thsConText)
{ }
public override void Handle(int value)
{
if (value < 20 && value > 10)
{
Console.WriteLine("切換到B");
m_Context.SetState(new StateB(m_Context));
}
}
}
public class StateB : State
{
public StateB(ConText thsConText)
: base(thsConText)
{
}
public override void Handle(int value)
{
if (value < 30 && value > 20)
{
Console.WriteLine("切換到C");
m_Context.SetState(new StateC(m_Context));
}
}
}
public class StateC : State
{
public StateC(ConText thsConText)
: base(thsConText)
{
}
public override void Handle(int value)
{
if (value < 10 && value > 0)
{
Console.WriteLine("切換到A");
m_Context.SetState(new StateA(m_Context));
}
}
}
使用如下:
static void Main(string[] args)
{
ConText stateA = new ConText();//首先實例化A的控制
stateA.SetState(new StateA(stateA));//設置A的狀態
stateA.Request(15);//切換到B狀態
stateA.Request(25);//切換到C狀態
stateA.Request(5);//恢復到原來A狀態
Console.ReadKey();
}
好處在于,當控制一個對象狀態轉換的條件過于復雜時,可以把判斷邏輯轉移到不同狀態的一系列類中,簡化判斷的邏輯。(將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。)
同時,可以通過定義新的子類很容易的增加新的狀態和轉換。(通過Context),消除了龐大的條件分支語句。
<pre>
適合使用場景,當一個對象的行為取決于它的狀態,并且它必須在運行時時刻根據狀態改變他的行為,可以考慮用到狀態模式。
</pre>