本篇主要分享一个简易状态机的实现。
目录
状态机
简单点讲状态机其实就是将一个具体的业务拆分为几个小的状态,状态之间由一定的条件来达成迁移。
因此对一个状态机而言,有两块内容:状态机、状态。
状态机管理着各个状态,控制状态之间的迁移,提供状态间迁移的注册方法,而状态只用处理自身的逻辑即可。
另外,不论是状态或者状态机都必须有明确的生命周期:开始、执行中、结束。
using System.Collections.Generic;
// 状态
public abstract class IState
{
// 所属状态机
protected IStateMachine mMachine;
// 初始化
public void Init(IStateMachine machine)
{
mMachine = machine;
}
// 开启当前状态
public void DoStart(string key = null)
{
mMachine.curState = this;
OnStart(key);
}
public abstract void OnStart(string key = null);
// 当前状态定时器
public abstract void DoUpdate();
// 结束当前状态
public void DoEnd(string key = null)
{
OnEnd();
mMachine.DoEnd(key);
}
protected abstract void OnEnd();
}
public abstract class IStateMachine
{
// 当前状态
public IState curState;
// 转换关系集合
protected Dictionary<IState, Dictionary<string, IState>> mTransition = new Dictionary<IState, Dictionary<string, IState>>();
// 添加转换关系
protected void AddTransition(IState beforeState, IState afterState, string key)
{
if (!mTransition.TryGetValue(beforeState, out var dicAfterStates))
{
dicAfterStates = new Dictionary<string, IState>();
mTransition.Add(beforeState, dicAfterStates);
}
dicAfterStates.Add(key, afterState);
}
// 开启状态机
public void DoStart(string key = null)
{
// 若当前有状态执行中则结束当前状态
if (curState != null)
{
curState.DoEnd("interupt");
}
OnStart(key);
}
// 结束当前状态
public void DoEnd(string key = null)
{
// 获取下一个状态
if (mTransition.TryGetValue(curState, out var dicAfterStates))
{
if (dicAfterStates.TryGetValue(key, out var