public static object process(object[] args) { FiniteStateMachineVariables variables = new FiniteStateMachineVariables(args); IState state = new StartState(); List<IState> statesStack = new List<IState>(); while (true) { statesStack.Add(state); if (state is INormalState) { state = ((INormalState)state).execute(variables); } else if (state is IFinishState) { return ((IFinishState)state).getResult(variables); } else if (state is IErrorState) { throw new FiniteStateMachineException(((IErrorState)state).getErrorMessage(variables)); } else { throw new Exception(string.Format("Unknown kind of state '{0}'", state.GetType().Name)); } } }
public object getResult(FiniteStateMachineVariables variables) { if (variables.result is int && ((int)variables.result) % 2 == 0) { return string.Format("{0} :-)", variables.result); } else { return variables.result; } }
public string getErrorMessage(FiniteStateMachineVariables variables) { return "Shit happened - " + variables.defaultErrorMessage + " - be happy!"; }
public IState execute(FiniteStateMachineVariables variables) { variables.result = new Random().Next(); return new FinishStateDefault(); }
public IState execute(FiniteStateMachineVariables variables) { variables.defaultErrorMessage = "Error message " + new Random().Next(); return new BlaBlaError(); }
public IState execute(FiniteStateMachineVariables variables) { if (new Random().NextDouble() > 0.5) { return new State2(); } else { return new State3(); } }