接下来,我们继续我们的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执行状态的切换。下面把整个代码给大家展现一下:
[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
usingSystem;
publicclassFSEvent {
protectedFiniteStateMachine.EnterState mEnterDelegate;
protectedFiniteStateMachine.PushState mPushDelegate;
protectedFiniteStateMachine.PopState mPopDelegate;
protectedenumEventType { NONE, ENTER, PUSH, POP };
protectedstringmEventName;
protectedFSState mStateOwner;
protectedstringmTargetState;
protectedFiniteStateMachine mOwner;
protectedEventType eType;
publicFunc<object,object,object,bool> mAction = null;
publicFSEvent(stringname, stringtarget, 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;
}
publicFSState Enter(stringstateName) {
mTargetState = stateName;
eType = EventType.ENTER;
returnmStateOwner;
}
publicFSState Push(stringstateName) {
mTargetState = stateName;
eType = EventType.PUSH;
returnmStateOwner;
}
publicvoidPop() {
eType = EventType.POP;
}
publicvoidExecute(objecto1,objecto2,objecto3) {
if(eType == EventType.POP) {
mPopDelegate();
}
elseif(eType == EventType.PUSH) {
mPushDelegate(mTargetState, mOwner.CurrentState.StateName);
}
elseif(eType == EventType.ENTER) {
mEnterDelegate(mTargetState);
}
elseif(mAction !=null) {
mAction(o1, o2, o3);
}
}
}
|
设计四把FSM常用的类已经封装好了,接下来我们会在设计五中去封装一个EventSystem类。用于处理事件的注册,分发等功能。