este problema se puede tratar de diferentes maneras, sin embargo te mostramos la que en nuestra opinión es la solución más completa.
Solución:
El corazón de una máquina de estado es la tabla de transición, que lleva un estado y un símbolo (lo que llamas un evento) a un nuevo estado. Eso es solo un índice de dos array de estados Por cordura y seguridad tipográfica, declare los estados y símbolos como enumeraciones. Siempre agrego un miembro de “longitud” de alguna manera (específico del idioma) para verificar array límites. Cuando he codificado a mano FSM, formateo el código en formato de fila y columna con espacios en blanco. Los otros elementos de una máquina de estados son el estado inicial y el conjunto de estados de aceptación. La implementación más directa del conjunto de estados de aceptación es una array de booleanos indexados por los estados. En Java, sin embargo, las enumeraciones son clases, y puede especificar un argumento “aceptando” en la declaración para cada valor enumerado e inicializarlo en el constructor de la enumeración.
Para el tipo de máquina, puede escribirlo como una clase genérica. Tomaría dos tipos de argumentos, uno para los estados y otro para los símbolos, un array argumento para la tabla de transición, un solo estado para el inicial. El único otro detalle (aunque es fundamental) es que debe llamar a Enum.ordinal() para obtener un número entero adecuado para indexar la transición. arrayya que no hay sintaxis para declarar directamente un array con un índice de enumeración (aunque debería haberlo).
Para adelantarse a un problema, EnumMap
no funcionará para la tabla de transición, porque el key requerido es un par de valores de enumeración, no uno solo.
enum State
Initial( false ),
Final( true ),
Error( false );
static public final Integer length = 1 + Error.ordinal();
final boolean accepting;
State( boolean accepting )
this.accepting = accepting;
enum Symbol
A, B, C;
static public final Integer length = 1 + C.ordinal();
State transition[][] =
// A B C
State.Initial, State.Final, State.Error
,
State.Final, State.Initial, State.Error
;
EasyFSM es una biblioteca Java dinámica que se puede utilizar para implementar un FSM.
Puede encontrar documentación para el mismo en: Finite State Machine en Java
Además, puede descargar la biblioteca en: Java FSM Library: DynamicEasyFSM
Puede implementar Finite State Machine de dos maneras diferentes.
Opción 1:
Máquina de estados finitos con un flujo de trabajo predefinido : Recomendado si conoce todos los estados de antemano y la máquina de estado está casi arreglada sin ningún cambio en el futuro
-
identificar todos los posibles estados en tu aplicación
-
Identificar todos los eventos en tu aplicación
-
Identificar todos los condiciones en su solicitud, lo que puede conducir a una transición de estado
-
La ocurrencia de un evento puede causar transiciones de Estado
-
Construya una máquina de estados finitos decidiendo un flujo de trabajo de estados y transiciones.
Por ejemplo, si ocurre un evento 1 en el estado 1, el estado se actualizará y el estado de la máquina aún puede estar en el estado 1.
Si ocurre un evento 2 en el Estado 1, en alguna evaluación de condición, el sistema pasará del Estado 1 al Estado 2
Este diseño se basa en Estado y Contexto patrones.
Eche un vistazo a las clases de prototipos de máquinas de estados finitos.
Opcion 2:
Árboles de comportamiento: Recomendado si hay cambios frecuentes en el flujo de trabajo de la máquina de estado. Puede agregar dinámicamente un nuevo comportamiento sin romper el árbol.
La base Tarea class proporciona una interfaz para todas estas tareas, el tareas de la hoja son los que acabamos de mencionar, y las tareas principales son los nodos interiores que deciden qué tarea ejecutar a continuación.
los Tareas tienen solo la lógica que necesitan para hacer realmente lo que se requiere de ellos, toda la lógica de decisión de si una tarea ha comenzado o no, si necesita actualizarse, si ha terminado con éxito, etc. está agrupada en el controlador de tareas clase, y añadido por composición.
los decoradores son tareas que “decoran” otra clase envolviéndola y dándole una lógica adicional.
Finalmente, el Pizarra class es una clase propiedad de la IA principal a la que cada tarea tiene una referencia. Funciona como una base de datos de conocimiento para todas las tareas de la hoja.
Echa un vistazo a este artículo de Jaime Barrachina Verdía para más detalles
Reseñas y valoraciones del tutorial
Puedes añadir valor a nuestro contenido informacional aportando tu veteranía en las interpretaciones.