コード例 #1
0
        public void TransitionTo(State toState)
        {
            var fromState          = ActiveState;
            var transitionHandlers = PossibleTransitions.AllTransitionsFromTo(fromState, toState);

            if (transitionHandlers.Count == 0)
            {
                throw new Exception("A transition from state " + fromState.Identifier + " to state " +
                                    toState.Identifier + " is not available.");
            }

            var runnedHandlers = new StateTransitions();

            foreach (var transitionHandler in transitionHandlers)
            {
                var partialTransitionWorked = transitionHandler.PerformTransitionToPointOfPossibleCommit();

                runnedHandlers.Add(transitionHandler);

                /* When there is at least one handler that is not satisfied, then
                 * we roll back all handlers and we do not set the new state.
                 * */
                if (!partialTransitionWorked)
                {
                    runnedHandlers.Rollback();
                    return;
                }
            }

            runnedHandlers.Commit();
            ActiveState = toState;
        }
コード例 #2
0
 public StateMachine(
     StateList possibleStates,
     State initialState,
     StateTransitions possibleTransitions)
 {
     PossibleStates      = possibleStates;
     InitialState        = initialState;
     PossibleTransitions = possibleTransitions;
     ActiveState         = InitialState;
 }