Tiempo de lectura: 4 minutos

Patrón State | Estado

El patrón State es un patrón de comportamiento que permite realizar acciones diferentes dependiendo del estado en el que se encuentre. Normalmente este estado es un atributo del objeto que cambia de valor.

El patrón State nos puede ser de gran utilidad en aquellos casos donde una entidad tiene un atributo y de su valor depende el realizar múltiples acciones. Llevado a la práctica, si estáis programando una entidad que tiene asociada un grafo de estados con múltiples transiciones y tenéis múltiples if..else o un switch que puede ir creciendo, parad, pensar y mirad si las acciones dependen de un estado del objeto, si es así, puede ser que este patrón encaje en vuestro problema.

De otra forma, si tenemos un objeto que cambia la forma de hacer una cosa según el estado de un atributo, posiblemente este patrón te pueda ayudar.

Ventajas

La principal ventaja es abstraer 

Show me the code

Solicitan una aplicación para realizar una acción según el tiempo que haga en cada momento. El tiempo se toma cada 5 minutos y puede darse las siguientes opciones: Sol, lluvia, nieva, nublado. En el momento del desarrollo, sólo se contempla estas cuatro opciones pero debe dejarse lo más abierto posible pues se podrían añadir nuevos estados de tiempo.

TypeWeather.java

En nuestro código tendremos cuatro clases que implementarán la interfaz TypeWeather. Esta interfaz define los tipos de estado que puede tener el tiempo. TypeWeather tendrá un método que deberán implementar todos los tipos ‘executeAction’. Este método realizará una acción según el tipo de estado del tiempo.

Sunny.java

En la clase Sunny, el método implementado de la interfaz enviará un email:

Cloudy.java

En la clase Cloudy, el método implementado realizará una petición al web service:

Raining.java

En la clase Raining, el método implementado enviará una señal digital a un dispositivo externo para cerrar la ventana:

Snowing.java

Por último, la clase Snowing mostrará un gif animado con copos de nieve cayendo.

Weather.java

Ahora vamos a definir la clase que contiene el atributo typeWeather y que permite realizar una acción u otra según cambie su estado. Para llevar a cabo el cambio, tendremos el método request(). También se podría haber omitido y hacer realizado justo el cambio en el setTypeWeather pero personalmente, creo que así queda más limpio porque puede ser que en algún momento asignemos el tipo y no queramos ejecutar nada.

MainStatePatter.java

Esta clase es donde voy a gestionar el cambio de estados del ejemplo. Es una clase muy trivial, se tiene que pensar que el cambio del estado se puede producir en cualquier momento de la aplicación: al pulsar un botón, al recibir un servicio web, etc.

Tenéis todo el código subido en github. El ejemplo es muy trivial y la finalidad es que se entienda, seguramente en el día a día puede ser más complicado de detectar.