Introdução

Quando você programa orientado a objetos por tempo suficiente, alguns problemas/comportamentos se repetem, não a solução exata, mas o formato do problema:

  • Preciso trocar de comportamento em runtime sem um monte de if”;
  • Preciso que vários objetos saibam quando algo mudou
  • preciso criar um objeto complexo sem um construtor gigante

Essencialmente, um design pattern é apenas isso. Uma solução já testada e batizada para um desses formatos de problema. Não é uma biblioteca que você importa, não é código pronto pra colar. É mais parecido com uma receita ou um esqueleto que você adapta para o seu caso específico.

A analogia que mais ajuda: é como aberturas de xadrez. Um jogador experiente reconhece a posição no tabuleiro e já sabe uma sequência de jogadas que historicamente funciona bem ali, mas ele adapta conforme o adversário reage, não copia cegamente. Design pattern é isso: reconhecer "ah, esse é um problema tipo X" e já entrar com uma estrutura que resolve bem esse tipo de problema.

Por que isso importa de verdade?

Vocabulário compartilhado

Quando um colega do time diz “aqui dá pra usar um Observer”, todo mundo que conhece o pattern já entendeu a ideia inteira na hora, sem precisar de um parágrafo explicando “ah, eu quero que vários objetos sejam avisados quando esse aqui mudar”. É um atalho de comunicação entre desenvolvedores.

Soluções já brigadas com a realidades

Alguém já tentou resolver esse problema de um jeito ingênuo, tomou a dor de cabeça de manutenção, e refinou até chegar numa estrutura que aguenta essa mudança sem quebrar tudo. Usar pattern é pular direto para a versão que já sobreviveu a esse processo.

As três familias de Patterns

Criacional

Problemas de "como eu crio esse objeto sem virar bagunça?" Se seu objeto tem 8 parâmetros opcionais no construtor, ou se você precisa decidir em runtime qual classe concreta instanciar, é um problema criacional.

Estrutural

Problemas de "como eu encaixo essas peças pra formar algo maior?" Pensa em peças de LEGO: você quer que blocos diferentes se conectem de forma flexível, sem que um bloco precise saber os detalhes internos do outro.

Comportamental

Problemas de "quem fala com quem, e quem é responsável pelo quê?" É sobre distribuir responsabilidade e comunicação entre objetos sem criar uma teia de dependências onde tudo conhece tudo.

Tipo O que define Exemplos relevantes
Criacional Como objetos são criados Singleton, Factory, Builder
Estrutural Como classes e objetos se organizam / relacionam Adapter, Composite, Decorator
Comportamental Como objetos interagem e se comunicam Observer, Strategy, Mediator

Um exemplo único, para sentir a ideia geral

Esquece os 23 nomes e conceitos por um segundo e vamos focar em um só problema puro:

// Sem pattern nenhum: um "if" gigante que cresce toda vez que aparece um jeito novo de pagar void ProcessarPagamento(string metodo, decimal valor) { if (metodo == "cartao") Console.WriteLine($"Cobrando R${valor} no cartão..."); else if (metodo == "pix") Console.WriteLine($"Gerando QR code de R${valor}..."); else if (metodo == "boleto") Console.WriteLine($"Emitindo boleto de R${valor}..."); // daqui a um mês: "criptomoeda", "paypal"... essa função nunca para de crescer } 
// Com pattern: cada forma de pagar é sua própria peça, intercambiável interface IFormaPagamento { void Processar(decimal valor); } class PagamentoCartao : IFormaPagamento { public void Processar(decimal valor) => Console.WriteLine($"Cobrando R${valor} no cartão..."); } class PagamentoPix : IFormaPagamento { public void Processar(decimal valor) => Console.WriteLine($"Gerando QR code de R${valor}..."); } ____ IFormaPagamento forma = new PagamentoPix(); forma.Processar(150); // forma nova? cria a classe, nunca mexe no código que já existe 

Isso, especificamente, tem nome (Strategy), mas o que importa aprender primeiro é o raciocínio: identificar que "essa parte do código vai crescer e mudar" e já desenhar pra absorver mudança sem reescrever o que já funciona. O nome do pattern vem depois, é só o rótulo pra essa forma de pensar já ter sido catalogada antes de você.