狀態模式
當一個對象的內在狀態改變時允許改變其行爲(不同的狀態對應不同的行爲),這個對象看起來像是改變了其類。
class Program
{
static void Main(string[] args)
{
Context c=new Context(new ConcreteStateA());//設置Context的初始狀態爲ConcreteStateA
//不斷地請求,同時更改狀態
c.Request();
c.Request();
c.Request();
c.Request();
Console.Read();
}
}
//抽象狀態類,定義一個接口以封裝與Context的一個特定狀態相關的行爲
abstract class State
{
public abstract void Handle(Context context);
}
//具體狀態類,每一個子類實現一個與Context的一個狀態相關的行爲
class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State=new ConcreteStateB();//設置ConcreteStateA的下一狀態是ConcreteStateB
}
}
class ConcreteStateB: State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();//設置ConcreteStateB的下一狀態是ConcreteStateA
}
}
//維護一個ConcreteState子類的實例,這個實例定義當前的狀態
class Context
{
private State state;
public Context(State state)//定義Context的初始狀態
{
this.state = state;
}
public State State//可讀寫的狀態屬性,用於讀取當前狀態和設置新狀態
{
get { return state; }
set
{
state = value;
Console.WriteLine("當前狀態:" + state.GetType().Name);
}
}
public void Request()//對請求做處理,並設置下一狀態
{
state.Handle(this);
}
}
優點
- 消除龐大的條件分支語句
- 通過把各種狀態轉移邏輯分佈到State的子類之間,來減少相互間的依賴