// Estratégia diferente para cálculo de frete public interface CalculoFrete { double calcular(double peso); } public class FreteSedex implements CalculoFrete { public double calcular(double peso) { return peso * 10; } } public class FretePac implements CalculoFrete { public double calcular(double peso) { return peso * 5; } }
Padrões ajudam a:
=> Uma frase já transmite:
Ex.: Strategy pode virar apenas “passar função como parâmetro” em linguagens funcionais.
Regra prática:
Comece simples. Introduza um padrão quando houver um motivo claro.
Padrões não:
São ferramentas, não objetivo final.
Dica:
Cada categoria agrupa padrões com propósitos parecidos.
new
public interface Transporte { void entregar(); } public class Caminhao implements Transporte { public void entregar() { System.out.println("Entrega por caminhão"); } } public abstract class Logistica { public void planejarEntrega() { Transporte t = criarTransporte(); t.entregar(); } protected abstract Transporte criarTransporte(); }
// API antiga class TomadaAntiga { void ligarDoisPinos() { ... } } // Nova interface esperada interface TomadaTresPinos { void ligarTresPinos(); } // Adapter class Adaptador implements TomadaTresPinos { private TomadaAntiga antiga; public Adaptador(TomadaAntiga antiga) { this.antiga = antiga; } public void ligarTresPinos() { antiga.ligarDoisPinos(); } }
interface Observador { void atualizar(); } class Sujeito { private List<Observador> obs = new ArrayList<>(); void adicionar(Observador o) { obs.add(o); } void notificar() { for (Observador o : obs) o.atualizar(); } }
Além dos GoF:
Arquiteturais
Integração
Teste
Entenda o problema primeiro. Depois veja se um padrão ajuda.