!
狀态模式允許一個對象在其内部狀态改變時改變它的行為,使對象看起來似乎修改了它的類
抽象狀态類可以是抽象類,也可以是接口,不同狀态類就是繼承這個父類的不同子類,狀态類的産生是由于環境類存在多個狀态,同時還滿足兩個條件:這些狀态經常需要切換,在不同的狀态下對象的行為不同。是以可以将不同對象下的行為單獨提取出來封裝在具體的狀态類中,使得環境類對象在其内部狀态改變時可以改變它的行為,對象看起來似乎修改了它的類,而實際上是由于切換到不同的具體狀态類實作的。由于環境類可以設定為任一具體狀态類,是以它針對抽象狀态類進行程式設計,在程式運作時可以将任一具體狀态類的對象設定到環境類中,進而使得環境類可以改變内部狀态,并且改變行為。
(1)、環境角色(Context):也稱上下文,定義用戶端所感興趣的接口,并且保留一個具體狀态類的執行個體。這個具體狀态類的執行個體給出此環境對象的現有狀态。
(2)、抽象狀态角色(State):定義一個接口,用以封裝環境對象的一個特定的狀态所對應的行為。
public abstract class State
{
public abstract void WorkProcess(Work work);
}
/// <summary>
/// 工作類
/// </summary>
public class Work
{
private State CurrentState { get; set;}
public Work()
{
CurrentState=new ForenoonState();
}
private int hours;
public int Hours { get => hours; set => hours = value; }
public void SetState(State s)
{
this.CurrentState = s;
}
public void ShowState()
{
this.CurrentState.WorkProcess(this);
}
/// <summary>
/// 上午工作狀态類
/// </summary>
public class ForenoonState : State
{
public override void WorkProcess(Work work)
{
if (work.Hours<12)
{
Console.WriteLine("現在是:{0}點,工作剛開始!");
}
else
{
work.SetState(new NoonState());
work.ShowState();
}
}
}
/// <summary>
/// 中午工作狀态類
/// </summary>
public class NoonState : State
{
public override void WorkProcess(Work work)
{
if (work.Hours < 13)
{
Console.WriteLine("現在是:{0}點,中午了該吃飯了");
}
else
{
work.SetState(new AfternoonState());
work.ShowState();
}
}
}