Boas práticas e padrões · Padrões estruturais · 4 min de leitura
Adapter
Faz uma interface incompatível (SDK, API antiga) se encaixar na interface que o seu código espera.
Arraste para o lado para ver o diagrama inteiro.
Uso típico
Integrar bibliotecas de terceiros (mapas, pagamentos, analytics), APIs legadas ou DTOs de rede. O adaptador converte nomes, unidades (metros × quilômetros), tipos e erros para o modelo do seu domínio.
Benefícios
- O SDK fica confinado em uma classe: atualizações de versão mexem em um arquivo.
- Testes usam um fake da sua interface, sem o SDK.
- É o "adaptador" da arquitetura hexagonal (portas e adaptadores).
No código
// sua interface, no vocabulário do domínio
interface Geocoder { coordenadas(endereco: string): Promise<{ lat: number; lng: number }> }
// SDK externo com outra forma
declare class VendorGeo { lookup(q: { text: string }): Promise<{ results: { latitude: number; longitude: number }[] }> }
class VendorGeocoderAdapter implements Geocoder {
constructor(private sdk: VendorGeo) {}
async coordenadas(endereco: string) {
const r = await this.sdk.lookup({ text: endereco });
const p = r.results[0];
if (!p) throw new EnderecoNaoEncontrado(endereco);
return { lat: p.latitude, lng: p.longitude };
}
} O resto do app só conhece Geocoder. O formato do fornecedor, e os erros dele, ficam dentro do adaptador.
Em resumo
- Converte uma interface na que o cliente espera.
- Confina SDKs de terceiros em um lugar.
- Facilita trocar fornecedor e testar.
- Base da arquitetura de portas e adaptadores.