一个简单的状态机 (c#)

版权声明:原创文章版权归我所有——学习则共享。 https://blog.csdn.net/kesshei/article/details/89371477

用法

class Program
    {
        static void Main(string[] args)
        {
            //状态机
            //根据当前的不同的状态,做出不同的事件操作
            StateMachine.Register("cat", new Cat());
            StateMachine.Register("dog", new Dog());
            StateMachine.SetState("cat");
            int i = 0;
            StateMachine.Start();
            StateMachine.RunInterval = 10;
            Thread.Sleep(2000);
            StateMachine.SetState("dog");
            Thread.Sleep(2000);
            StateMachine.SetState("cat");
            Console.ReadLine();
        }
    }

这个是运行的结果

核心代码如下: 

 对象接口

    /// <summary>
    /// 状态对象
    /// </summary>
    public interface IStateObject
    {
        /// <summary>
        /// 进入状态
        /// </summary>
        void EnterState();
        /// <summary>
        /// 离开状态
        /// </summary>
        void ExitState();
        /// <summary>
        /// 更新状态
        /// </summary>
        void UpdateState();
    }

 状态机 的实现

 /// <summary>
    /// 状态机
    /// </summary>
    public class StateMachine
    {
        /// <summary>
        /// 运行 Update 时间间隔 毫秒
        /// </summary>
        public static int RunInterval = 500;
        /// <summary>
        /// 当前状态
        /// </summary>
        private static string CurrentState;
        /// <summary>
        /// 字典存放当前所有对象
        /// </summary>
        private static ConcurrentDictionary<string, IStateObject> Dic = new ConcurrentDictionary<string, IStateObject>();
        /// <summary>
        /// 当前的线程对象
        /// </summary>
        private static Thread thread;
        /// <summary>
        /// 是否已经在运行
        /// </summary>
        private static bool IsRun = false;
        /// <summary>
        /// 注册一个状态对象
        /// </summary>
        /// <param name="stateObject"></param>
        /// <param name="istateObject"></param>
        public static void Register(string stateObject, IStateObject istateObject)
        {
            Dic.AddOrUpdate(stateObject, istateObject, (a, b) => b);
        }
        /// <summary>
        /// 设置当前状态
        /// </summary>
        /// <param name="stateObject"></param>
        public static void SetState(string stateObject)
        {
            if (CurrentState != stateObject)
            {
                if (CurrentState != null)
                {
                    IStateObject obj = null;
                    Dic.TryGetValue(CurrentState, out obj);
                    if (obj != null)
                    {
                        obj.ExitState();
                    }
                }
                CurrentState = stateObject;
                IStateObject objobj = null;
                Dic.TryGetValue(CurrentState, out objobj);
                if (objobj != null)
                {
                    objobj.EnterState();
                }
            }
        }
        /// <summary>
        /// 自己启动服务
        /// </summary>
        public static void Start()
        {
            if (!IsRun)
            {
                thread = new Thread(new ThreadStart(Run));
                thread.IsBackground = true;
                thread.Start();
                IsRun = true;
            }
        }
        /// <summary>
        /// 自己停止服务
        /// </summary>
        public static void Close()
        {
            if (IsRun)
            {
                try
                {
                    thread.Abort();
                    while (thread.ThreadState != ThreadState.Aborted)
                    {
                        SpinWait.SpinUntil(() => false, 20);
                    }
                }
                catch (Exception)
                {
                }
                thread = null;
                IsRun = false;
            }
        }
        /// <summary>
        /// 线程执行的任务
        /// </summary>
        private static void Run()
        {
            while (true)
            {
                Updata();
                SpinWait.SpinUntil(() => false, RunInterval);
            }
        }
        /// <summary>
        /// 更新数据
        /// </summary>
        public static void Updata()
        {
            IStateObject objobj = null;
            Dic.TryGetValue(CurrentState, out objobj);
            if (objobj != null)
            {
                objobj.UpdateState();
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/kesshei/article/details/89371477