实现有限状态机 FSM (2)
解释迁移表
public enum State
{
LOCKED,
UNLOCKED
}
public enum Event
{
COIN,
PASS
}
public interface TurnstileController
{
void Lock();
void Unlock();
void ThankYou();
void Alarm();
}
public class Turnstile
{
private class Transition
{
public State startState;
public Event trigger;
public State endState;
public Action action;
public Transition(State start, Event e, State end, Action a)
{
this.startState = start;
this.trigger = e;
this.endState = end;
this.action = a;
}
}
private List<Transition> transitions = new List<Transition>();
private State state = State.LOCKED;
private Turnstile(TurnstileController controller)
{
transitions.Add(new Transition(State.LOCKED, Event.COIN, State.UNLOCKED,controller.Unlock));
transitions.Add(new Transition(State.LOCKED, Event.PASS, State.LOCKED, controller.Alarm));
transitions.Add(new Transition(State.UNLOCKED, Event.COIN, State.UNLOCKED, controller.ThankYou));
transitions.Add(new Transition(State.UNLOCKED, Event.PASS, State.LOCKED, controller.Lock));
}
public void HandEvent(Event e)
{
foreach (var transition in transitions)
{
if (state == transition.startState &&
e == transition.trigger)
{
state = transition.endState;
transition.action();
}
}
}
}