Como probablemente haya leído, el State Design Pattern es útil cuando el estado varía el comportamiento de algún objeto cuya composición incluye ese estado. Esto implica la idea de una clase abstracta State
, interfaz, o enumerated type - aunque dependiendo del idioma Duck Typing también lo hará - que define cualquier comportamiento común y/o métodos requeridos.
aspectos clave
En realidad, hay dos aspectos importantes a considerar en el trabajo con el patrón de estado: enumeración y de transición. La enumeración simplemente significa identificar el conjunto de estados posibles (por ejemplo, días de la semana) o más abstractivamente los tipos de estados (es decir, metaestados) como inicio, finalización y en el medio para un motor de flujo de trabajo. Transición significa decidir cómo modelar el movimiento entre estados donde esto normalmente se hace capturando todas las transiciones posibles en una representación tabular (es decir, Finite State Machine) o hace que cada estado conozca sus posibles "transiciones" a otros estados.
Normalmente, las transiciones van de la mano con los metaestados porque no es posible conocer todos los estados y relaciones por adelantado en un sistema tan dinámico donde se pueden agregar nuevos estados, y por lo tanto transiciones, en tiempo de ejecución. Además, con el enfoque de transición, cierto comportamiento-notificaciones por ejemplo-se convierte en parte de la transición, en lugar del estado mismo.
Ejemplos
Hay varios escenarios, ya sea que he trabajado o discutidos, donde se trata de una instalación de uso:
- flujo de trabajo
- juego de ordenador oponente A.I.
- Proceso orquestación
Por flujo de trabajo quiero decir algo así como jBPM. Los sistemas de este tipo se preocupan por controlar la atención adecuada de las personas adecuadas en el momento adecuado. Por lo general, envían muchos correos electrónicos u otro tipo de notificación. Y, el proceso que representan necesita la capacidad de cambiar a medida que la organización cambia, mientras que los datos que se administran normalmente cambian mucho más lentamente.
Ordenador Juego oponente A.I. se explica por sí mismo. No es algo que haya escrito, pero en una conversación con quienes lo han hecho, estos sistemas suelen ser autónomos. En otras palabras, a diferencia del flujo de trabajo, el juego generalmente no tiene la capacidad de alterar el proceso utilizado para controlar a los oponentes de la computadora.
Orchestration de proceso es similar al flujo de trabajo, pero se enfoca en la integración del sistema, en lugar de interacción con personas. El marco Apache Mule es un ejemplo. Aquí el estado puede describir el estado (por ejemplo, iniciado, en proceso, finalizado) y tipo (por ejemplo, punto de integración ftp, punto de integración sql).
Conclusión
A diferencia de otras respuestas, creo que la encapsulación del estado es una excelente manera de gestionar el cambio de sistemas de software. Hecho bien, facilita esos cambios o permite a los usuarios hacerlo en tiempo de ejecución. Usted hace una compensación de más flexibilidad a cambio de una mayor complejidad de implementación. Entonces, tal enfoque probablemente no sea útil para el carro de compras, por ejemplo, donde el comportamiento es probablemente muy conocido y no le gusta cambiar. Por otro lado, cuando el proceso está sujeto a cambios, encaja muy bien.
No es adecuado si tiene MUCHOS estados, por ejemplo, en un juego en 3D. –
Entonces, ¿qué tipo de alternativa sugieres? – Ivan
¿Qué tal un enlace a la definición del patrón de estado? –