Patrón State en C#: Guía Completa

Introducción: Comportamiento cambiante

State permite cambiar el comportamiento de un objeto cuando su estado interno cambia. En lugar de usar grandes if o switch, encapsulas cada estado como una clase.

Esto hace que las transiciones sean explícitas y el código más mantenible.

Cambio de estado
Prompt: Gradient color transitions, abstract state change visual.

1. Naturaleza: Metamorfosis

Una mariposa cambia completamente su comportamiento según su estado: huevo, oruga, crisálida, adulta.

Cada fase tiene reglas y capacidades distintas, igual que un objeto en State delega su comportamiento al estado actual.

Metamorfosis
Prompt: Butterfly lifecycle stages, educational illustration style.

2. Mundo Real: Semáforo

El mismo semáforo responde distinto según su estado: rojo, amarillo, verde.

Las transiciones están definidas y se ejecutan automáticamente, evitando condiciones dispersas por el código.

Semáforo
Prompt: Traffic light at night, cinematic style.

3. Implementación en C#: Código Paso a Paso

public interface IEstado { void Manejar(Contexto c); }

public class EstadoRojo : IEstado
{
    public void Manejar(Contexto c) { Console.WriteLine("Rojo"); c.Estado = new EstadoVerde(); }
}

public class EstadoVerde : IEstado
{
    public void Manejar(Contexto c) { Console.WriteLine("Verde"); c.Estado = new EstadoRojo(); }
}

public class Contexto
{
    public IEstado Estado { get; set; }
    public void Solicitar() => Estado.Manejar(this);
}

4. State vs Strategy

State cambia automáticamente por transiciones. Strategy se elige explícitamente.

Si el contexto decide cuándo cambiar, estás en State; si el cliente selecciona el algoritmo, es Strategy.

5. Diagrama UML

UML State
Prompt: UML diagram of State pattern, clean vector layout.
Transiciones
Prompt: State transition diagram, minimal infographic style.

⚠️ Cuándo NO Usar State

  • Si solo tienes unas pocas condiciones simples.
  • Si las transiciones son muy raras y no justifican clases extra.

💪 Ejercicio

Crea estados para un reproductor: Reproduciendo, Pausado, Detenido.

Conclusión

State hace que las transiciones sean claras y el código más limpio. Es ideal para máquinas de estados, flujos y UI complejas.