# Propósito
El patrón State permite a un objeto alterar su comportamiento cuando su estado interno cambia. Encapsula los estados variables como objetos independientes.
# Problema
-
Comportamiento Variable: El objeto debe actuar de forma distinta según su estado en tiempo de ejecución.
-
Condicionales Complejos: Evitar
if/switchmasivos que dependen de variables de estado.
# Solución
Crear clases separadas para cada estado. El objeto principal (Contexto) delega la ejecución al objeto de estado actual.
# Estructura
# Participantes
- Context: Mantiene la referencia al estado actual y delega tareas.
- State (Interface): Define la interfaz para los estados.
- ConcreteState: Implementación específica de cada comportamiento.
# Cuándo Usarlo
Cuando un objeto tiene estados claramente identificables que alteran drásticamente su comportamiento frente a las mismas llamadas a métodos.
# Ventajas
-
verified
Single Responsibility: Lógica de cada estado aislada.
-
verified
Open/Closed: Fácil añadir nuevos estados sin tocar el contexto.
# Desventajas
-
warning
Explosión de Clases: Muchos estados implican muchos archivos.
-
warning
Overkill: Innecesario para objetos con pocos estados simples.
# Ejemplo: Semáforo
Gestión de estados Rojo, Amarillo y Verde con reglas de transición automáticas.
# Código Java
interface State { void handle(Context c); }
class GreenState implements State {
public void handle(Context c) {
System.out.println("Luz verde");
c.setState(new YellowState());
}
}
class Context {
private State state = new GreenState();
public void change() { state.handle(this); }
}
# Mapeo Participantes
- TrafficLightState: State Interface.
- RedState/GreenState: ConcreteStates.
- TrafficLightContext: Context.
# Conclusiones
Elimina la necesidad de condicionales enmarañados y hace que el flujo de transiciones sea explícito y fácil de auditar.
# Patrones relacionados
Strategy
Ambos usan delegación, pero State cambia según el estado interno.