🎯 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
oPagado
. - 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