原文:http://www.manew.com/thread-37318-1-1.html
在设计二中,我们实现了有限状态机管理类,接下来,我们实现FSState这个类,这里类主要是状态的基本操作以及事件触发。在这里我们定义了在FiniteStateMachine类里声明的三个委托。在FSState里面使用的代码如下:
protected FiniteStateMachine.EnterState mEnterDelegate;
protected FiniteStateMachine.PushState mPushDelegate;
protected FiniteStateMachine.PopState mPopDelegate;
这个FSState是独立的一个类,不继承Mono,我们定义了一个构造函数,将我们的委托进行了初始化:
public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
mStateObject = obj;
mStateName = name;
mOwner = owner;
mEnterDelegate = e;
mPushDelegate = pu;
mPopDelegate = po;
mTranslationEvents = new Dictionary<string, FSEvent>();
}
我们声明了FSEvent事件处理函数用于将事件的名字和事件加入的Dictionary里面
public FSEvent On(string eventName) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
mTranslationEvents.Add(eventName, newEvent);
return newEvent;
}
加入到列表后,我们需要从表里面取出去执行,这就需要Trigger触发函数:
public void Trigger(string name) {
mTranslationEvents[name].Execute(null, null, null);
}
public void Trigger(string eventName, object param1) {
mTranslationEvents[eventName].Execute(param1, null, null);
}
public void Trigger(string eventName, object param1, object param2) {
mTranslationEvents[eventName].Execute(param1, param2, null);
}
public void Trigger(string eventName, object param1, object param2, object param3) {
mTranslationEvents[eventName].Execute(param1, param2, param3);
}
以上也是FSState类的核心代码,闲话少说,FSState类的整个代码,如下:
using System;
using System.Collections;
using System.Collections.Generic;
public class FSState {
protected FiniteStateMachine.EnterState mEnterDelegate;
protected FiniteStateMachine.PushState mPushDelegate;
protected FiniteStateMachine.PopState mPopDelegate;
protected IState mStateObject;
protected string mStateName;
protected FiniteStateMachine mOwner;
protected Dictionary<string, FSEvent> mTranslationEvents;
public FSState(IState obj, FiniteStateMachine owner, string name, FiniteStateMachine.EnterState e, FiniteStateMachine.PushState pu, FiniteStateMachine.PopState po) {
mStateObject = obj;
mStateName = name;
mOwner = owner;
mEnterDelegate = e;
mPushDelegate = pu;
mPopDelegate = po;
mTranslationEvents = new Dictionary<string, FSEvent>();
}
public IState StateObject {
get {
return mStateObject;
}
}
public string StateName {
get {
return mStateName;
}
}
public FSEvent On(string eventName) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
mTranslationEvents.Add(eventName, newEvent);
return newEvent;
}
public void Trigger(string name) {
mTranslationEvents[name].Execute(null, null, null);
}
public void Trigger(string eventName, object param1) {
mTranslationEvents[eventName].Execute(param1, null, null);
}
public void Trigger(string eventName, object param1, object param2) {
mTranslationEvents[eventName].Execute(param1, param2, null);
}
public void Trigger(string eventName, object param1, object param2, object param3) {
mTranslationEvents[eventName].Execute(param1, param2, param3);
}
public FSState On<T>(string eventName, Func<T, bool> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T param1;
try { param1 = (T)o1; } catch { param1 = default(T); }
action(param1);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
public FSState On<T>(string eventName, Action<T> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T param1;
try { param1 = (T)o1; } catch { param1 = default(T); }
action(param1);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
public FSState On<T1, T2>(string eventName, Func<T1, T2, bool> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T1 param1;
T2 param2;
try { param1 = (T1)o1; } catch { param1 = default(T1); }
try { param2 = (T2)o2; } catch { param2 = default(T2); }
action(param1, param2);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
public FSState On<T1, T2>(string eventName, Action<T1, T2> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T1 param1;
T2 param2;
try { param1 = (T1)o1; } catch { param1 = default(T1); }
try { param2 = (T2)o2; } catch { param2 = default(T2); }
action(param1, param2);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
public FSState On<T1, T2, T3>(string eventName, Func<T1, T2, T3, bool> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T1 param1;
T2 param2;
T3 param3;
try { param1 = (T1)o1; } catch { param1 = default(T1); }
try { param2 = (T2)o2; } catch { param2 = default(T2); }
try { param3 = (T3)o3; } catch { param3 = default(T3); }
action(param1, param2, param3);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
public FSState On<T1, T2, T3>(string eventName, Action<T1, T2, T3> action) {
FSEvent newEvent = new FSEvent(eventName, null, this, mOwner, mEnterDelegate, mPushDelegate, mPopDelegate);
newEvent.mAction = delegate (object o1, object o2, object o3) {
T1 param1;
T2 param2;
T3 param3;
try { param1 = (T1)o1; } catch { param1 = default(T1); }
try { param2 = (T2)o2; } catch { param2 = default(T2); }
try { param3 = (T3)o3; } catch { param3 = default(T3); }
action(param1, param2, param3);
return true;
};
mTranslationEvents.Add(eventName, newEvent);
return this;
}
}