C#代码实现状态机

状态机四要素

现态、条件、动作、次态

现态:是指当前所处的状态
条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态转移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态。
次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

 

状态机图表表示方法

 

实现效果

 

using System;

namespace StateMachineDemo
{
    /// <summary>
    /// 事件枚举
    /// </summary>
    public enum FSMEvent
    {
        Event0,
        Event1,
        Event2
    }

    class Program
    {
        static FSMContext context = new FSMContext(new State0());

        static void Main(string[] args)
        {
            while (true)
            {
                SetEvent();
                context.Request();
            }
        }

        /// <summary>
        /// 事件触发
        /// </summary>
        static void SetEvent()
        {
            Console.WriteLine("======================================");
            Console.WriteLine($"当前状态:{context.State.ToString()} 请输入一个事件(Event0,Event1,Event2):");
            string result = Console.ReadLine().Trim().ToLower();

            switch (result)
            {
                case "event0":
                    context.FSMEvent = FSMEvent.Event0;
                    break;
                case "event1":
                    context.FSMEvent = FSMEvent.Event1;
                    break;
                case "event2":
                    context.FSMEvent = FSMEvent.Event2;
                    break;
                default:
                    break;
            }
        }
    }

    /// <summary>
    /// 上下文的作用基本等同于图表的框架作用。里面包含状态集合以及状态转移,
    /// 只不过将状态拆分成了不同的类,
    /// 状态转移也分散在各个不同的类中进行处理
    /// </summary>
    public class FSMContext
    {
        private IState state;

        public IState State
        {
            get { return state; }
            set { state = value; }
        }

        private FSMEvent fSMEvent;

        public FSMEvent FSMEvent
        {
            get { return fSMEvent; }
            set { fSMEvent = value; }
        }

        /// <summary>
        /// 创建对象时,对状态进行初始化
        /// </summary>
        /// <param name="state"></param>
        public FSMContext(IState state)
        {
            this.state = state;
        }

        /// <summary>
        /// 对事件进行响应
        /// </summary>
        /// <param name="state"></param>
        public void Request()
        {
            state.Handle(this);
        }

        public void SetState(IState state)
        {
            this.state = state;
        }
    }

    /// <summary>
    /// 此处使用接口和抽象类等价
    /// 一系列状态的父类
    /// </summary>
    public interface IState
    {
        void Handle(FSMContext fsmContext);
    }

    public class State0 : IState
    {
        public void Handle(FSMContext fsmContext)
        {
            switch (fsmContext.FSMEvent)
            {
                case FSMEvent.Event0:
                    //Action0 
                    Console.WriteLine("执行动作:00");
                    fsmContext.SetState(new State0());
                    break;
                case FSMEvent.Event1:
                    //Action1
                    Console.WriteLine("执行动作:01");
                    fsmContext.SetState(new State1());
                    break;
                case FSMEvent.Event2:
                    //Action2
                    Console.WriteLine("执行动作:02");
                    fsmContext.SetState(new State2());
                    break;
                default:
                    break;
            }

            Console.WriteLine($"下一状态:{fsmContext.State.ToString()}");
        }
    }

    public class State1 : IState
    {
        public void Handle(FSMContext fsmContext)
        {
            if (fsmContext.FSMEvent == FSMEvent.Event2)
            {
                Console.WriteLine("执行动作:12");
                fsmContext.SetState(new State2());
            }
            else
            {
                Console.WriteLine("执行所需事件:Event2");
            }
        }
    }

    public class State2 : IState
    {
        public void Handle(FSMContext fsmContext)
        {
            if (fsmContext.FSMEvent == FSMEvent.Event0)
            {
                Console.WriteLine("执行动作:20");
                fsmContext.SetState(new State0());
            }
            else
            {
                Console.WriteLine("执行所需事件:Event0");
            }
        }
    }
}

 

posted @ 2023-07-25 16:41  CHHC  阅读(291)  评论(0编辑  收藏  举报