2021年11月19日 星期五

狀態模式 State Pattern

脫離了博弈產業後,前往線上教育業

線上教育業有一個很固定的商業模式,成為會員前都會有一種固定的歷程

留單>預約體驗>客戶

然後有看到一段code使用狀態模式來實作

狀態模式其實跟策略模式一樣,也是要把每個實作的類別切開

只是狀態模式是可以封裝轉換規則

 
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //留單
            var member1 = new Member
            {
                Status = 1
            };
            member1.Action();

            //預約體驗
            var member2 = new Member
            {
                Status = 2
            };
            member2.Action();

            //客戶
            var member3 = new Member
            {
                Status = 3
            };
            member3.Action();
            Console.Read();
        }
    }

    public sealed class Member
    {
        private IState current;
        public int Status { get; set; }
        public Member()
        {
            current = new 留單結構();
        }

        public void SetState(IState state)
        {
            current = state;
        }

        public void Action()
        {
            current.Process(this);
        }
    }

    public interface IState
    {
        void Process(Member member);
    }

    public sealed class 留單結構 : IState
    {
        void IState.Process(Member member)
        {
            if (member.Status == 1)
            {                
                member.SetState(new 留單實作());
                member.Action();
            }
            else
            {
                member.SetState(new 預約體驗結構());
                member.Action();
            }
        }
    }

    public sealed class 預約體驗結構 : IState
    {
        void IState.Process(Member member)
        {
            if (member.Status == 2)
            {
                
                member.SetState(new 預約體驗實作());
                member.Action();
            }
            else
            {
                member.SetState(new 客戶結構());
                member.Action();
            }
        }
    }

    public sealed class 客戶結構 : IState
    {
        void IState.Process(Member member)
        {
            if (member.Status == 3)
            {
                member.SetState(new 客戶實作());
                member.Action();
            }
            else
            {
                Console.WriteLine("查無此狀態...");
            }
        }
    }

    public class 留單實作 : IState
    {
        public void Process(Member member)
        {
            Console.WriteLine("留單狀態處理中...");
        }        
    }

    public class 預約體驗實作 : IState
    {
        public void Process(Member member)
        {
            Console.WriteLine("預約體驗處理中...");
        }
    }

    public class 客戶實作 : IState
    {
        public void Process(Member member)
        {
            Console.WriteLine("恭喜你成為我們的客戶...");
        }
    }

}


這邊會有Member context可以傳入狀態
就會依照當時的Status去實作當下狀態的類別
而實作的部分其實就是策略者模式,而多了結構類別封裝了轉換規則

沒有留言:

張貼留言