Я хочу смоделировать своего рода FSM (конечный автомат). У меня есть последовательность состояний (скажем, от StateA до StateZ). Эта последовательность называется цепочкой и реализуется внутри как Список. Я добавлю состояния по порядку, который я хочу, чтобы они запускались.Проектирование цепочки состояний
Моя цель - сделать последовательность действий на моем компьютере (например, щелчками мыши). (Я знаю, что это было сделано миллион раз).
Так состояние определяется как:
boolean Precondition()
< - Проверяет, является ли для этого состояния, некоторое условие истинно. Например, если я хочу нажать кнопку «Запись» программы, в этом методе я бы проверил, работает ли процесс программы или нет. Если это так, перейдите к следующему состоянию в списке цепочек, в противном случае перейдите к тому, что было определено как состояние отказа (обычно это первое состояние из всех).IState GetNextState()
< - Возвращает следующее состояние для оценки. Если условие Precondition() было успешным, оно должно привести к следующему состоянию в цепочке, иначе оно должно привести к состоянию отказа.Run()
Просто проверяетPrecondition()
и устанавливает внутренние данные, поэтомуGetNextState()
работает должным образом.
Так, наивный подход к этому было бы что-то вроде этого:
Chain chain = new Chain();
//chain.AddState(new State(Precondition, FailState, NextState) <- Method structure
chain.AddState(new State(new WinampIsOpenCondition(), null, new <problem here, I want to referr to a state that still wasn't defined!>);
Большая проблема в том, что я хочу сделать ссылку на государство, которое на данный момент еще не была определена. Я мог бы обойти проблему, используя строки при переходе в состояния и используя внутреннюю хеш-таблицу, но разве нет более ясной альтернативы?
Я мог бы просто передать только предварительные условия и состояния отказа в конструкторе, имея цепочку непосредственно перед выполнением, помещая в каждое состояние правильное следующее состояние в публичном свойстве, но это кажется неудобным.