terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat state.md
guest@codeandosimple: ~/blog/design-patterns $ cat state.md

State Pattern_

// "Que cada desafío académico sea una oportunidad para demostrar tu capacidad y crecimiento. Enfrenta tus estudios con valentía y determinación, porque cada logro comienza con el coraje de intentarlo" - George Saville

# 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/switch masivos 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

Estructura UML State

# 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.

Ejemplo State Semáforo

# 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.