实现有限状态机 FSM (3)

STATE 模式

public interface TurnstileState
{
    void Coin(Turnstile t);
    void Pass(Turnstile t);
}

public class LockedTurnstileState : TurnstileState
{
    public void Coin(Turnstile t)
    {
        t.SetUnlocked();
        t.Unlock();
    }

    public void Pass(Turnstile t)
    {
        t.Alarm();
    }
}

public class UnlockedTurnstileState : TurnstileState
{
    public void Coin(Turnstile t)
    {
        t.ThankYou();
    }

    public void Pass(Turnstile t)
    {
        t.SetLocked();
        t.Lock();
    }
}

public interface TurnstileController
{
    void Lock();
    void Unlock();
    void ThankYou();
    void Alarm();
}

public class Turnstile
{
    private static readonly TurnstileState lockedState = new LockedTurnstileState();
    private static readonly TurnstileState unlockedState = new UnlockedTurnstileState();
    private TurnstileState state = unlockedState;

    private TurnstileController turnstileCtrller;
    public Turnstile(TurnstileController controller)
    {
        this.turnstileCtrller = controller;
    }

    public void Coin()
    {
        state.Coin(this);
    }

    public void Pass()
    {
        state.Pass(this);
    }

    public void SetLocked()
    {
        state = lockedState;
    }

    public void SetUnlocked()
    {
        state = unlockedState;
    }

    public Boolean IsLocked()
    {
        return state == lockedState;
    }

    public Boolean IsUnlocked()
    {
        return state == unlockedState;
    }

    public void ThankYou()
    {
        turnstileCtrller.ThankYou();
    }

    public void Alarm()
    {
        turnstileCtrller.Alarm();
    }

    public void Lock()
    {
        turnstileCtrller.Lock();
    }

    public void Unlock()
    {
        turnstileCtrller.Unlock();
    }
}