O exemplo do pedido
Um pedido pode ser rascunho, confirmado ou cancelado. Se cada operação acumula condicionais para todos esses estados, torna-se fácil permitir transições inválidas ou esquecer um caso.
Exemplo conceitual em C#
public interface IEstadoPedido
{
IEstadoPedido Confirmar();
}
public sealed class Rascunho : IEstadoPedido
{
public IEstadoPedido Confirmar() => new Confirmado();
}
public sealed class Confirmado : IEstadoPedido
{
public IEstadoPedido Confirmar() =>
throw new InvalidOperationException("Pedido já confirmado.");
}A entidade ou contexto mantém o estado atual e delega operações; as transições são explícitas e podem ser testadas isoladamente.
Quando e como evitar excesso
Use quando estados alteram significativamente operações e transições. Para poucos estados com regras simples, um enum e uma validação central podem ser mais claros. Compare com Strategy: State representa condição e transições do ciclo de vida; Strategy seleciona um algoritmo. Mais no catálogo GoF.