No representaría cada piso como un estado separado. Los estados están asociados con un conjunto de comportamiento que es diferente del comportamiento de otros estados. En general, un ascensor no se comporta de manera diferente en el piso 1 en comparación con el piso 2. Por lo tanto, no creo que los pisos sean buenos estados.
Comenzaría con tres estados: inactivo, cargando y moviendo. El estado inactivo es cuando no hay destinos. El estado de carga es mientras los pasajeros están cargando o descargando. Al ingresar al estado de carga, el elevador abrirá las puertas. Al salir de Loading, cierre las puertas. El estado de movimiento es mientras el ascensor viaja a un destino. Al entrar / salir del estado de movimiento, el elevador arranca / detiene el motor.
Los eventos que causan transiciones entre estados incluyen los botones del piso (dentro del elevador) y los botones de llamada (los botones arriba / abajo) en cada piso. Otro evento ocurre cuando el elevador en movimiento llega a cada piso. El número de piso es información que se incluye con estos eventos.
Cuando el estado Inactivo recibe un evento de botón, compara el número de piso con el piso actual. Si el número del piso del evento del botón es igual al piso actual, entonces pase al estado Cargando. Si el número de piso del evento del botón es diferente del piso actual, agregue el número de piso a la lista de destino y pase al estado de movimiento.
Cuando el estado de Carga recibe un evento de botón, compara el número de piso con el piso actual. Si el número del piso del evento del botón es diferente del piso actual, agregue el piso a la lista de destino y pase al estado de movimiento.
Cuando el estado en movimiento recibe un evento de botón, agrega el piso a la lista de destinos. Cuando el estado en movimiento recibe el evento de piso alcanzado, actualiza el piso actual y se compara con la lista de destinos. Si el piso alcanzado es un destino, elimine el destino de la lista y pase al estado de Carga.
La parte difícil será administrar la lista de destinos. Mi primer pensamiento fue que una estructura de datos de lista enlazada sería útil. Los destinos se pueden priorizar y ordenar a medida que se agregan a la lista, de modo que el primer elemento de la lista sea el siguiente destino. Pero eso puede ser demasiado complicado. Una idea más simple puede ser mantener dos matrices separadas de destinos, una matriz para cada dirección. Hay un elemento en la matriz para cada piso. Si el piso es un destino mientras viaja en una dirección particular, entonces el elemento de la matriz correspondiente es verdadero. El punto es que hay más de una forma de hacerlo y no sé qué funcionará mejor. Vas a tener que iterar sobre el diseño y la lógica.
Una de las cosas buenas de este diseño de máquina de estado es que se extiende fácilmente para soportar cualquier número de pisos. En otras palabras, no tiene que agregar nuevos estados y eventos cuando agrega pisos.