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

实现效果

![]()
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");
}
}
}
}



















