天天看點

C#狀态模式

!

狀态模式允許一個對象在其内部狀态改變時改變它的行為,使對象看起來似乎修改了它的類

抽象狀态類可以是抽象類,也可以是接口,不同狀态類就是繼承這個父類的不同子類,狀态類的産生是由于環境類存在多個狀态,同時還滿足兩個條件:這些狀态經常需要切換,在不同的狀态下對象的行為不同。是以可以将不同對象下的行為單獨提取出來封裝在具體的狀态類中,使得環境類對象在其内部狀态改變時可以改變它的行為,對象看起來似乎修改了它的類,而實際上是由于切換到不同的具體狀态類實作的。由于環境類可以設定為任一具體狀态類,是以它針對抽象狀态類進行程式設計,在程式運作時可以将任一具體狀态類的對象設定到環境類中,進而使得環境類可以改變内部狀态,并且改變行為。

(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();
        }
    }
}