Я хочу смоделировать нечто вроде конечного автомата. У меня есть последовательность состояний (скажем, от StateA до StateZ). Эта последовательность называется цепочкой и реализована внутри как список. Я добавлю состояния в том порядке, в котором я хочу их запускать.
Моя цель - иметь возможность выполнять последовательность действий на моем компьютере (например, щелчки мышью). (Я знаю, что это было сделано миллион раз).
Итак, состояние определяется как:
boolean Precondition()
<- Проверяет, является ли для этого состояния какое-либо условие истинным. Например, если я хочу нажать кнопку «Запись» программы, в этом методе я проверю, запущен ли процесс программы или нет. Если это так, перейдите к следующему состоянию в списке цепочек, в противном случае перейдите к тому состоянию, которое было определено как состояние сбоя (обычно это первое из всех состояний). </li>
IState GetNextState()
<- Возвращает следующее состояние для оценки. Если Precondition () был успешным, он должен привести к следующему состоянию в цепочке, в противном случае он должен привести к состоянию отказа. </li>
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!>);
Большая проблема в том, что я хочу сделать ссылку на государство, которое на данный момент еще не было определено. Я мог бы обойти проблему, используя строки при переходе к состояниям и используя внутреннюю хеш-таблицу, но разве нет более ясной альтернативы?
Я мог бы просто передать только предварительные условия и состояния сбоя в конструкторе, если бы цепочка непосредственно перед выполнением помещала в каждое состояние правильное следующее состояние в открытом свойстве, но это выглядит немного неловко.