Design patterns com IA são cinco, neste guia: Strategy, Observer, Adapter, máquina de estados e retry com circuit breaker. Cada um desacopla uma parte do sistema que tende a virar gambiarra quando agentes de IA escrevem o código. Abaixo, exemplos com notificação, pagamento, machine state de compra e chamadas à API da OpenAI.
O que são design patterns aplicados a código de IA
Design patterns com IA são padrões de projeto clássicos aplicados ao código que você escreve, ou faz um agente escrever, em sistemas que usam modelos de linguagem. Eles definem estruturas testadas por engenheiros ao longo de décadas: o conceito foi formalizado em 1994, no livro Design Patterns da Gang of Four. Um pattern funciona como uma receita: você reconhece o problema, aplica a estrutura e evita reinventar uma solução pior.
O problema que eles resolvem em 2026 é específico. Agentes de IA geram código funcional rápido, mas costumam acumular if encadeado, acoplamento com SDKs de terceiros e loops de retry sem controle. O resultado é software que funciona na demo e apodrece na manutenção. Os cinco padrões abaixo atacam esse acúmulo ponto por ponto.
Strategy: esconda maneiras intercambiáveis atrás de uma interface
O padrão Strategy coloca formas intercambiáveis de fazer uma tarefa atrás da mesma interface, e é o primeiro dos design patterns com IA que vale implementar. Sem ele, enviar notificação por e-mail, SMS ou push costuma virar um switch case gigante dentro do núcleo da aplicação. Cada novo canal aumenta o método e o risco de quebrar os antigos.
Com Strategy, você define uma interface NotificationStrategy com o método send. As classes EmailStrategy, SmsStrategy e PushStrategy implementam essa interface, e o núcleo da aplicação apenas chama send sem saber qual canal está em uso. A implementação exata varia por linguagem, mas a ideia central não muda.
Os ganhos são três, e todos aparecem rápido em produção:
- Expansibilidade: adicionar um canal novo significa criar uma classe nova, sem tocar no núcleo.
- Troca de provedor: migrar para um serviço de e-mail de terceiros exige implementar apenas a estratégia nova.
- Testabilidade: você instancia cada estratégia com dependências injetadas e testa sem efeitos colaterais, ou seja, sem disparar e-mail de verdade para um cliente.
Esse último ponto importa demais em notificação. Testes que enviam mensagens reais são frágeis e caros; Strategy isola isso por construção.
Observer: emita eventos e desacople quem escuta
Observer faz o emissor de um evento se preocupar apenas em emitir; quem quiser escuta, e quem não quiser simplesmente ignora. Muita gente chama isso de event driven, embora event driven seja um conceito mais amplo. O Observer é o mecanismo concreto: alguém emite, alguém ouve, e os dois lados ficam desacoplados.
Pense em uma compra finalizada. Em vez de o método finalizarCompra chamar saveAnalytics de forma síncrona, ele emite o evento "cliente comprou o produto". Um serviço de analytics escuta esse evento e trata o que precisar. Se o analytics sair do ar, a finalização da compra não percebe diferença nenhuma.
Você pode implementar o padrão de um serviço nativo de nuvem até uma fila rodando na sua própria máquina, com algo como o RabbitMQ, broker de mensagens de código aberto. Um agente de IA que publica eventos e vários sistemas que escutam quando quiserem é exatamente esse desenho, e é por isso que Observer se encaixa bem em arquiteturas com agentes.
Adapter: traduza interfaces de terceiros sem reescrever o sistema
Adapter cria uma camada de tradução entre a interface que seu código espera e a interface que um componente externo expõe. Parece com Strategy, mas resolve outro problema: Strategy troca comportamentos; Adapter faz uma interface incompatível encaixar na sua.
O exemplo clássico é pagamento. Sua aplicação espera que todo provedor tenha o método charge. Ao integrar o PayPal, você descobre que ele expõe pay, com assinatura diferente, incluindo moeda. Em vez de reestruturar a aplicação, você cria um PayPalAdapter que implementa charge e, por dentro, chama PayPal.pay passando os parâmetros certos. O resto do sistema nem fica sabendo da diferença.
Strategy e Adapter funcionam muito bem juntos. No fluxo de pagamento, um Strategy decide o provedor conforme o método: cartão cai no Stripe, plataforma de pagamentos para internet, e Pix cai em outro provedor. Em paralelo, um adapter por provedor esconde a SDK dentro da sua própria camada, de forma que a lógica de negócio nunca importa a SDK diretamente. Trocar o PayPal pelo Stripe passa a significar deletar um adaptador e escrever outro; todo o resto permanece intocado.
Máquina de estados: formalize transições de compras e agentes
Uma máquina de estados define um conjunto finito de estados e as transições válidas entre eles. Você já estudou o conceito, mesmo sem lembrar: aparece em compiladores, autômatos finitos e expressões regulares. Em sistemas de verdade, ela substitui a pior espécie de if encadeado.
Considere um pedido de compra. Os estados válidos são pending, paid, shipped, delivered e cancelled. Um mapa de transições define, por exemplo, que pending pode ir para paid ou cancelled, mas nunca direto para shipped. Qualquer tentativa de transição inválida é rejeitada pelo mapa, em vez de descoberta em produção por um bug de notificação da Visa processada na ordem errada.
O formato do mapa é livre: pattern matching em Elixir, um dicionário comum em outras linguagens. O que importa é que cada transição fique explícita e validável. Em orquestração de agentes de IA o padrão brilha: um fluxo complexo de agente vira uma máquina de estados com gatilhos e requisitos por transição. O n8n, ferramenta de automação de workflows com código aberto e self-hosting, é essencialmente isso, uma máquina de estados visual.
Retry, backoff exponencial e circuit breaker
Provedores de pagamento caem, e APIs de IA também. O pior comportamento possível é um while sem condição de saída martelando a OpenAI, empresa por trás dos modelos GPT e ChatGPT, enquanto o serviço está fora do ar. Um for com três tentativas já é melhor, mas ainda insuficiente sem controle de tempo.
A evolução natural tem três camadas, e cada uma corrige um defeito da anterior:
- Espera entre tentativas: inserir uma pausa de 1 segundo antes de repetir evita transformar seu retry em algo parecido com um ataque de negação de serviço, especialmente quando a parte quebrada é um serviço seu chamando outro serviço seu.
- Backoff exponencial com jitter: dobrar a espera a cada tentativa, 1 segundo, depois 2, depois 4, dá tempo de recuperação ao provedor; adicionar aleatoriedade nos tempos evita que várias partes do código dispararem requests no mesmo segundo e entrem em conflito.
- Circuit breaker: um disjuntor decide quando parar de tentar. Se todas as chamadas de todos os clientes estão falhando no mesmo endpoint, um circuit breaker global simplesmente bloqueia novas chamadas, sem nem alcançar o provedor, e faz uma chamada de sonda a cada 10 minutos para verificar se o serviço voltou.
A combinação importa porque cada peça responde a um modo de falha diferente: o retry resolve falhas momentâneas, o backoff evita agravar instabilidade, e o circuit breaker protege seu sistema de um provedor que já se sabe offline. Sem a última peça, você paga latência e custo por cada request condenado.
Comparativo rápido dos cinco padrões
Cada padrão resolve um tipo diferente de acoplamento, e a escolha depende do problema concreto que aparece no seu código. A tabela abaixo resume o papel de cada um:
| Padrão | Problema que resolve | Exemplo típico |
|---|---|---|
| Strategy | Múltiplas formas de fazer a mesma tarefa | E-mail, SMS e push atrás de send |
| Observer | Emissor acoplado a quem consome o dado | Evento de compra ouvido por analytics |
| Adapter | Interface de terceiros incompatível | Traduzir PayPal.pay para charge |
| Máquina de estados | Transições espalhadas em if encadeado | Ciclo de vida de pedido e agentes |
| Retry + circuit breaker | Chamadas instáveis a provedores externos | APIs de pagamento e de IA que caem |
Na prática, eles se combinam: Strategy escolhe o provedor, Adapter esconde a SDK, a máquina de estados valida o fluxo e o circuit breaker protege as chamadas. Quem quiser aprofundar em backend e arquitetura encontra formações como o Crazystack Typescript e o Bootcamp do Dev Doido, do Gustavo Dev Doido, em crazystack.com.br.
Perguntas frequentes sobre design patterns com IA
- Design patterns com IA ainda fazem sentido se o agente escreve o código? Fazem, e talvez mais do que antes. Agentes geram volume alto de código, então a estrutura que impede acoplamento precisa estar definida antes da geração, não corrigida depois.
- Qual a diferença entre Strategy e Adapter? Strategy troca comportamentos equivalentes atrás da mesma interface, como canais de notificação. Adapter traduz uma interface incompatível para a que seu código já espera, como adaptar a SDK do PayPal. Eles se usam juntos com frequência.
- Preciso de fila de mensagens para usar Observer? Não. O padrão é sobre desacoplar emissor e ouvinte; a implementação pode ir de eventos em memória até um broker como o RabbitMQ. A fila entra quando você precisa de durabilidade ou distribuição.
- Por que o retry simples com três tentativas não basta? Sem espera e sem backoff exponencial, as três tentativas podem agravar a sobrecarga do provedor. Sem circuit breaker, você continua gastando chamadas contra um serviço que já se sabe fora do ar.
- Máquina de estados serve só para pedidos de e-commerce? Não. Qualquer fluxo com estados e transições se beneficia, incluindo orquestração de agentes de IA, aprovações e pipelines. Ferramentas como o n8n são, na essência, máquinas de estados visuais.
Transforme suas aulas técnicas em artigos com o Skala Blog
Design patterns viram conhecimento durável quando estão escritos e organizados, não apenas em vídeo. Se você explica arquitetura, código ou qualquer conhecimento técnico em vídeos no YouTube, esse material pode render um artigo estruturado sem trabalho duplicado. O Skala Blog faz esse caminho: você cola a URL do vídeo, a plataforma transcreve e gera um artigo pronto para revisar e publicar.
Fork this article
Start a new branch from the same video, shaped your way. You keep the credit; the original keeps the attribution.
A fork in another language is filed as a translation of this article, so the two pages point at each other. You can unlink it later from the editor.
0/240
You are creating
- Format
- For
- Language
- Source
- Your angle
You will be asked to sign in before it is generated.
Buy credits