1. 程式人生 > 實用技巧 >設計模式行為型之狀態模式

設計模式行為型之狀態模式

定義

一.狀態模式的定義:狀態模式主要解決的是當控制一個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。

二.狀態模式的意圖:允許一個物件在其內部狀態改變時改變它的行為。

模擬場景

模擬交通燈指示燈

兩個角色

上下文環境(Context):它定義了客戶程式需要的介面並維護一個具體狀態角色的例項,將與狀態相關的操作委託給當前的Concrete State物件來處理。

抽象狀態(State):定義一個介面以封裝使用上下文環境的的一個特定狀態相關的行為。

具體狀態(Concrete State):實現抽象狀態定義的介面。下列程式碼中指的是不同顏色的燈

程式碼實現

1.定義一個抽象類

    /// <summary>
    /// 抽象類
    /// </summary>
    public abstract class LightBase
    {
        /// <summary>
        /// 燈顏色
        /// </summary>
        public LightColor Color
        {
            get;
            set;
        }

        /// <summary>
        /// show
        
/// </summary> public abstract void Show(); /// <summary> /// 變色 /// </summary> public abstract void Turn(Context context); } /// <summary> /// 燈顏色 定義一個列舉 /// </summary> public enum LightColor { Red = 0, Yello = 1
, Green = 2 }

2.定義上下文物件

    /// <summary>
    /// 上下文物件
    /// </summary>
    public class Context
    {
        public LightBase CurrentLight
        {
            get;
            set;
        }

        public void Show()
        {
            this.CurrentLight.Show();
        }

        public void Turn()
        {
            this.CurrentLight.Turn(this);
        }
    }

3.定義三個具體子類

   /// <summary>
    /// 紅燈
    /// </summary>
    public class LightRed : LightBase
    {
        public LightRed()
        {
            this.Color = LightColor.Red;
        }
        public override void Show()
        {
            Console.WriteLine("紅燈停");
        }

        public override void Turn(Context context)
        {
            context.CurrentLight = new LightGreen();
        }
    }



    /// <summary>
    /// 黃燈
    /// </summary>
    public class LightYellow : LightBase
    {
        public LightYellow()
        {
            this.Color = LightColor.Yello;
        }
        public override void Show()
        {
            Console.WriteLine("黃燈亮了,等一等");
        }

        public override void Turn(Context context)
        {
            context.CurrentLight = new LightRed();
        }

    }


    /// <summary>
    /// 綠燈
    /// </summary>
    public class LightGreen : LightBase
    {
        public LightGreen()
        {
            this.Color = LightColor.Green;
        }

        public override void Show()
        {
            Console.WriteLine("綠燈行");
        }

        public override void Turn(Context context)
        {
            context.CurrentLight = new LightYellow();
        }
    }

上端測試程式碼

        static void Main(string[] args)
        {

            {
                LightBase light = new LightRed();
                Context context = new Context();
                context.CurrentLight = light;

                context.Show();
                context.Turn();
        
                context.Show();
                context.Turn();
               
                context.Show();
                context.Turn();
              
                context.Show();
                context.Turn();
            
                context.Show();
                context.Turn();

            }

執行結果如下:

總結

優點:將子類不同狀態的行為分離出來,降低類之間的耦合。

缺點:複雜性,子類變多

應用場景:比如像電路開關等這樣的狀態變化應用