状态机四要素
现态、条件、动作、次态
现态:是指当前所处的状态
条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态转移。
动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态。
次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
状态机图表表示方法
实现效果
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"); } } } }