State

Permite a un objeto cambiar de comportamiento al cambiar su estado interno; parece cambiar de clase.

Contexto

Un pedido pasa por: Draft → Placed → Paid → Shipped → Delivered. En cada estado, las acciones permitidas cambian.

Problema

Si lo modelas con if (status == ...) en cada método, tendrás switches gigantes y duplicación.

Solución

Cada estado es una clase con su comportamiento. La entidad delega en el estado actual y permite la transición.

#Ejemplo en C#

public abstract class OrderState
{
    public virtual void Pay(Order o)   => throw new InvalidOperationException();
    public virtual void Ship(Order o)  => throw new InvalidOperationException();
}

public class Placed   : OrderState { public override void Pay(Order o)  => o.SetState(new Paid()); }
public class Paid     : OrderState { public override void Ship(Order o) => o.SetState(new Shipped()); }
public class Shipped  : OrderState { }

public class Order
{
    private OrderState _state = new Placed();
    public void SetState(OrderState s) => _state = s;
    public void Pay()  => _state.Pay(this);
    public void Ship() => _state.Ship(this);
}
Cuándo NO aplicarlo

Si solo hay 2-3 estados con poca lógica diferenciada: un enum + switch basta.

Tradeoffs
Pro Contra
Elimina ifs y switches Más clases
Estados explícitos y testeables Las transiciones quedan dispersas

#behavioral #gof #fsm