🎯 State - EmilioCrespoPeran/pattern-designs GitHub Wiki

📚 Descripción del patrón

El patrón State permite a un objeto modificar su comportamiento cuando su estado interno cambia. El objeto parecerá cambiar su clase. Se utiliza comúnmente cuando un objeto debe cambiar su comportamiento en tiempo de ejecución dependiendo de su estado actual.

Evitar múltiples sentencias if/else o switch en clases que cambian de comportamiento según su estado. Cada estado se encapsula en una clase separada, lo que favorece el principio de responsabilidad única y el principio abierto/cerrado.

🧩 Enunciado del ejercicio 1: Gestión de Pedidos

Diseña un sistema que administre los distintos estados de un pedido en una tienda en línea utilizando el patrón State. Un pedido puede pasar por los siguientes estados:

  • Creado (por defecto)
  • Pagado
  • Enviado
  • Entregado
  • Cancelado

Cada transición de estado solo puede ocurrir si se cumplen ciertas condiciones. Por ejemplo:

  • No se puede enviar un pedido sin antes haberlo pagado.
  • Un pedido solo puede cancelarse si está en estado Creado o Pagado.
  • No se puede entregar un pedido sin que haya sido enviado.

✅ Requisitos

  • Define una interfaz EstadoPedido con métodos: pagar(), enviar(), entregar(), cancelar(), estado().
  • Cada estado debe ser representado por una clase concreta que implemente esta interfaz.
  • La clase Pedido debe delegar su comportamiento en el estado actual.
  • Los métodos deben retornar una cadena que indique la operación realizada o lanzar excepciones si la operación no es válida.

🧪 Test

Los tests para este ejercicio los puedes encontrar en src/test/java/es/cresdev/patterns/state/pedido/StatePedidoTests.java

🧩 Enunciado del ejercicio 2: Máquina Expendedora de Café

Diseña una máquina de café automatizada que opera con distintos estados. Dependiendo del estado, la máquina debe responder adecuadamente a eventos como insertar moneda, seleccionar café, recogerlo, cancelar operación, marcar como fuera de servicio o reiniciarse.

✅ Requisitos y acciones disponibles

La máquina puede estar en uno de los siguientes estados:

  • EsperandoMoneda: Estado inicial. Solo permite insertar una moneda.
  • EsperandoSeleccion: Luego de insertar una moneda, el usuario puede seleccionar el café o cancelar.
  • Preparando: Estado donde la máquina está haciendo el café. Solo se permite recoger el café o marcar fuera de servicio.
  • FueraDeServicio: Estado de error o mantenimiento. Solo permite reiniciar.
Acción Descripción
insertarMoneda() Transición válida solo desde EsperandoMoneda
seleccionarCafe() Válido solo después de insertar una moneda
recogerCafe() Solo posible cuando el café está preparado
cancelar() Solo posible desde EsperandoSeleccion o EsperandoMoneda
marcarFueraDeServicio() Permitido desde cualquier estado para mantenimiento o errores
reiniciar() Solo posible si la máquina está FueraDeServicio

🧪 Test

Los tests para este ejercicio los puedes encontrar en src/test/java/es/cresdev/patterns/state/expendedora/MaquinaCafeTests.java