Patrones de Diseño. Patrón State

Publicado el 05 febrero 2015 por Instintobinario

Hoy en la serie de patrones de diseño, el patrón State o Estado.

Propósito

Permitir a un objeto modificar su comportamiento cuando su estado interno cambia. El objeto aparecerá para cambiar su clase.

Motivación

Considerar una clase TCPConnection que representa una conexión de red. Un objeto de esta clase puede estar en varios estados (establecido, escuchando, cerrado). Cuando ese objeto recibe solicitudes de otros objetos, responde de forma diferente dependiendo de su estado.

La idea clave de este patrón es introducir una clase abstracta llamada TCPState para representar los estados de la red. Las subclases de esta clase implementan el comportamiento específico de cada estado.

Ejemplo del patrón State

Aplicabilidad

El patrón State se usa en cualquiera de estos casos:

  • El comportamiento de un objeto depende de su estado y debe cambiar su comportamiento en tiempo de ejecución dependiendo de ese estado.
  • Las operaciones tienen muchos condicionales que dependen del estado del objeto. Este estado está representado normalmente por uno o más enumerados. A menudo, varias operaciones contendrán la misma estructura condicional. El patrón State pone cada rama del condicional en una clase separada. Esto permite tratar el estado del objeto que puede variar independientemente de otros objetos.

Más concretamente, el patrón State suele usarse para implementar máquinas de estados.

Estructura

La clase Contexto define la interfaz de interés para los clientes. La clase State define una interfaz para encapsular el comportamiento asociado con un estado particular del contexto. Cada clase ConcreteState implementa un comportamiento asociado con un estado el contexto.

Estructura del patrón State

Consecuencias

Las ventajas del patrón State son:

  • Localiza el comportamiento de un estado específico y divide el comportamiento para diferentes estados: El patrón State pone todo el comportamiento asociado con un estado particular en un objeto. Debido a que todo el código de un estado específico está en un una subclase de State, los nuevos estados y transiciones pueden ser añadidos fácilmente añadiendo nuevas subclases.
  • Hace las transiciones entre estados explícitas: Cuando un objeto define su estado actual únicamente en términos de datos internos, sus transiciones no tienen una representación explícita. Introducir objetos separados para diferentes estados hace las transiciones más explícitas.
  • Los objetos de los estados pueden ser compartidos: Si los objetos de los estados no tienen variables instanciadas, el estado que representan esta codificado completamente en su tipo, entonces el contexto puede compartir el objeto del estado.

Usos conocidos

Como he dicho antes, este patrón suele usarse para implementar máquinas de estado. Por ejemplo podemos implementar fácilmente un diseño de un programa que permite crear y programar alarmas.

Máquina de estados del programa de las alarmas

El artículo Patrones de Diseño. Patrón State apareció por primera vez en Instinto Binario.