State es un patrón de diseño de comportamiento que permite a un objeto cambiar de comportamiento cuando cambia su estado interno.
El patrón extrae comportamientos relacionados con el estado, los coloca dentro de clases de estado separadas y fuerza al objeto original a delegar el trabajo de una instancia de esas clases, en lugar de actuar por su cuenta.
Apliquemos el patrón de diseño State en el contexto de unas máquinas expendedoras. Por simplificar, asumamos que la máquina solo tiene un tipo de artículo o producto. También por simplificar, asumamos que la máquina expendedora solo puede estar en 4 estados diferentes:
hasItem (tieneelArtículo)
noItem (notieneelArtículo)
itemRequested (artículoSolicitado)
hasMoney (tieneDinero)
Cada máquina expendedora realizará también distintas acciones. De nuevo, por simplificar, asumamos que solo hay cuatro acciones:
Seleccionar el artículo
Añadir el artículo
Insertar el dinero
Dispensar el artículo
El patrón de diseño State debe utilizarse cuando el objeto puede estar en varios estados diferentes y, dependiendo de la solicitud entrante, el objeto necesite cambiar su estado actual.
En nuestro ejemplo, una máquina expendedora puede encontrarse en muchos estados diferentes y estos estados cambiarán constantemente de uno a otro. Digamos que la máquina expendedora se encuentra en itemRequested. Una vez que se realiza la acción “Insertar dinero”, la máquina pasa al estado hasMoney.
Dependiendo de su estado actual, la máquina se puede comportar de forma diferente ante las mismas solicitudes. Por ejemplo, si un usuario quiere comprar un artículo, la máquina procederá a ello si se encuentra en hasItemState, o la rechazará si está en noItemState.
El código de la máquina expendedora no está contaminada con esta lógica; todo el código dependiente del estado se aloja en implantaciones de estado respectivas.