接下來,我們繼續我們的FSM有限狀態機的設計,在設計三中我們實現了FSState這個類,我們繼續實現FSEvent事件處理類。在FSEvent類裏面我們聲明瞭FiniteStateMachine裏面定義的委託函數。代碼如下:
protected FiniteStateMachine.EnterState mEnterDelegate; protected FiniteStateMachine.PushState mPushDelegate; protected FiniteStateMachine.PopState mPopDelegate;
同時我們定義了一個枚舉用於處理有限狀態機的狀態,使用了System裏面自帶的封裝的一個具有三個參數並返回TResult參數制定的雷興志的方法。
public Func<object,object,object,bool> mAction = null;
這個FSEvent事件類也是獨立的,不繼承Mono。它的核心功能主要是處理FSState的Enter,Push,Pop。代碼如下:
public FSState Enter(string stateName) { mTargetState = stateName; eType = EventType.ENTER; return mStateOwner; } public FSState Push(string stateName) { mTargetState = stateName; eType = EventType.PUSH; return mStateOwner; } public void Pop() { eType = EventType.POP; } public void Execute(object o1,object o2,object o3) { if (eType == EventType.POP) { mPopDelegate(); } else if (eType == EventType.PUSH) { mPushDelegate(mTargetState, mOwner.CurrentState.StateName); } else if (eType == EventType.ENTER) { mEnterDelegate(mTargetState); } else if (mAction != null) { mAction(o1, o2, o3); } }
總的來說,FSEvent是通過調用Enter,Push,Pop,Execute執行狀態的切換。下面把整個代碼給大家展現一下:
using System; public class FSEvent { protected FiniteStateMachine.EnterState mEnterDelegate; protected FiniteStateMachine.PushState mPushDelegate; protected FiniteStateMachine.PopState mPopDelegate; protected enum EventType { NONE, ENTER, PUSH, POP }; protected string mEventName; protected FSState mStateOwner; protected string mTargetState; protected FiniteStateMachine mOwner; protected EventType eType; public Func<object,object,object,bool> mAction = null; public FSEvent(string name, string target, FSState state, FiniteStateMachine owner, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) { mStateOwner = state; mEventName = name; mTargetState = target; mOwner = owner; eType = EventType.NONE; mEnterDelegate = e; mPushDelegate = pu; mPopDelegate = po; } public FSState Enter(string stateName) { mTargetState = stateName; eType = EventType.ENTER; return mStateOwner; } public FSState Push(string stateName) { mTargetState = stateName; eType = EventType.PUSH; return mStateOwner; } public void Pop() { eType = EventType.POP; } public void Execute(object o1,object o2,object o3) { if (eType == EventType.POP) { mPopDelegate(); } else if (eType == EventType.PUSH) { mPushDelegate(mTargetState, mOwner.CurrentState.StateName); } else if (eType == EventType.ENTER) { mEnterDelegate(mTargetState); } else if (mAction != null) { mAction(o1, o2, o3); } } }
設計四把FSM常用的類已經封裝好了,接下來我們會在設計五中去封裝一個EventSystem類。用於處理事件的註冊,分發等功能。