Patrón State
Ejemplos: Conexión/Desconexión y Ventanilla del Banco
Este patrón debe ser utilizado cuando:Este patrón permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Busca que un objeto pueda reaccionar según su estado interno. Si bien muchas veces esto se puede solucionar con un boolean o utilizando constantes, esto suele terminar con una gran cantidad de if-else, código ilegible y dificultad en el mantenimiento. La intención del State es desacoplar el estado de la clase en cuestión.
En determinadas ocasiones se requiere que un objeto tenga diferentes comportamientos según el estado en que se encuentra. Esto resulta complicado de manejar, sobretodo cuando se debe tener en cuenta el cambio de comportamientos y estados de dicho objeto, todos dentro del mismo bloque de código. El patrón State propone una solución a esta complicación, creando un objeto por cada estado posible.
- El comportamiento de un objeto depende de un estado, y debe cambiar en tiempo de ejecución según el comportamiento del estado.
- Cuando las operaciones tienen largas sentencias con múltiples ramas que depende del estado del objeto.
Este patrón se utiliza cuando un determinado objeto tiene diferentes estados y también distintas responsabilidades según el estado en que se encuentre en determinado instante. También puede utilizarse para simplificar casos en los que se tiene un complicado y extenso código de decisión que depende del estado del objeto.
El patrón State permite hacer diferentes cosas dependiendo del estado del objeto. En otras palabras, lo que cambia de acuerdo al estado es que se hace. Además, todas las posibilidades están incluidas en el código del modelo. A la hora de agregar nuevos estados y su correspondiente acción asociada basta con agregar una subclase sin tocar las demás (observando el Open-Close principle).
En cambio el patrón Strategy permite hacer lo mismo de diferentes maneras. En otras palabras, lo que cambia es como se hace. Este patrón usualmente permite que la implementación específica (la estrategia) se pueda seleccionar por configuración, por el estado de cierto objeto, etc.
Ejemplo: Conexión y Desconexión
Tenemos una conexión la cual puede estar en dos estados: conectada y desconectada
-Clase Conexion:
->
-Clase Conectado
->
-Clase Desconectado
->
-Programa principal:
->
Pantallazo en la ejecución:
Ejemplo: Ventanilla de Banco
Tenemos un banco y en el una ventanilla de atención al público.
Cuando llegamos, nos colocamos en la fila de la ventanilla.
- Si la misma esta abierta, seguiremos en la fila.
- En cambio, si esta cerrada nos colocaremos en otra fila o tomaremos alguna decisión acorde.
- Por otro lado, si vemos un cartel que dice "Espere 5 minutos por favor..." quizás tenemos que contemplar el tiempo disponible que tenemos.
Es decir, para nosotros, el comportamiento de un banco cambia radicalmente según el estado en el que se encuentre.
Esquema del Banco, Ventanilla y estado de la Ventanilla.
Clase Ventanilla
->
Clase EstadoVentanilla
->
Clase Abierta
->
Clase Cerrada
->
Clase Suspendida
->
Clase Banco
->
Clase Persona
->
Programa principal:
->
Pantallazo en la ejecución:
Enlaces de descarga:
Ejemplo Conexion
Ejemplo Banco-Ventanilla
Fuentes:
http://migranitodejava.blogspot.com.es/2011/06/state.html
http://lcanaveral.com/ean/state.pdf
http://www.design-nation.net/es/archivos/001844.php
http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/
http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf
http://r0d.developpez.com/articles/dp-state-es/
El patrón State aplicado al desarrollo de juegos
http://www.design-nation.net/es/archivos/001844.php
El patrón State aplicado al desarrollo de juegos ( II )
http://www.design-nation.net/es/archivos/001845.php
El patrón State aplicado al desarrollo de juegos ( III )
http://www.design-nation.net/es/archivos/001846.php
El patrón State aplicado al desarrollo de juegos ( IV y final )
http://www.design-nation.net/es/archivos/001856.php