設計模式(六):狀態模式

K戰神發表於2016-01-08

一、定義

允許一個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。

我們的程式中很多情況下是判斷一個引數的值,進行一些其他操作。這些情況必須依次過濾直到符合條件的時候,執行具體邏輯。

二、例項

我們原來的邏輯:

            PriceFlag pf = PriceFlag.AppPrice;

            if (pf == State.PriceFlag.DefaultPrice)
            {
            }
            else if (pf == State.PriceFlag.AppPrice)
            {
            }
            else if (pf == State.PriceFlag.PresellPrice)
            {
            }
            else if (pf == State.PriceFlag.PromotionPrice)
            {
            }
            else
            {
            }
View Code

現在我們來建立狀態模式:

2.1  State以及子類

抽象邏輯單元:我們看到原來的if邏輯通過外界傳入的狀態引數,根據狀態引數進行判斷,所以我們需要外界上下文;          

       還有一點,原來的 if 邏輯 在沒有符合條件的情況下,自動進入下一個判斷邏輯單元。重點已標紅.

    public abstract  class PriceProvider
    {             
       public abstract void GetPrice(Context context);        
    }

    public class DefaultPrice : PriceProvider
    {
        public override void GetPrice(Context context)
        {
            if (context.flag == PriceFlag.DefaultPrice)
            {
                Console.WriteLine("獲取:預設價格.");
            }
            else
            {
                context.SetState(new AppPrice());
                context.Handle();
            }
        }
    }
    public class AppPrice : PriceProvider
    {
        public override void GetPrice(Context context)
        {
            if (context.flag == PriceFlag.AppPrice)
            {
                Console.WriteLine("獲取:APP價格.");
            }
            else
            {
                context.SetState(new PresellPrice());
                context.Handle();
            }
        }
    }
    public class PresellPrice : PriceProvider
    {
        public override void GetPrice(Context context)
        {
            if (context.flag == PriceFlag.PresellPrice)
            {
                Console.WriteLine("獲取:預售價格.");
            }
            else
            {
                context.SetState(new PromotionPrice());
                context.Handle();
            }
        }
    }
    public class PromotionPrice : PriceProvider
    {       
        public override void GetPrice(Context context)
        {
            if (context.flag == PriceFlag.PromotionPrice)
            {
                Console.WriteLine("獲取:活動價格.");
            }
            else
            {
                Console.WriteLine("邏輯結束");
            }            
        }       
    }

 2.2 Context 上下文環境,這裡有幾個重要的功能:設定狀態、獲取狀態、執行邏輯

         還有一點是,維護一個狀態類。

 public class Context
    {
        private PriceProvider pp { get; set; } 
        public PriceFlag flag { get; set; }       
        public Context()
        {
            //初始狀態:預設價格
            pp = new DefaultPrice();  
        }     
        public void SetState(PriceProvider _pp)
        {
            //設定狀態
            pp = _pp;
        }
        public void Handle()
        {
            //執行邏輯
            pp.GetPrice(this);
        }
        public void GetState()
        {
            //獲取狀態
            Console.WriteLine("當前狀態:{0}", flag);
        }
    }

    public enum PriceFlag
    {
        DefaultPrice = 0,
        AppPrice = 1,
        PresellPrice = 2,
        PromotionPrice = 3,
        Other = 4
    }
View Code

 2.3 客戶端

            //狀態模式
            State.Context context = new Context();
            //變數
            context.flag = State.PriceFlag.PresellPrice;
            context.Handle();
            context.GetState();
            context.flag = State.PriceFlag.PromotionPrice;
            context.Handle();
            context.GetState();

 

相關文章