Pular para o conteúdo

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.

Tela de entrega → Mapa1Mapa → GoogleMapsAdapter2GoogleMapsAdapter → SDK externo: traduz chamadas3Mapa → OsmAdapterTela de entregaTela de entregaMapa — sua interfaceMapasua interfaceGoogleMapsAdapter — traduzGoogleMapsAdaptertraduzSDK externo — API diferenteSDK externoAPI diferenteOsmAdapter — troca fácilOsmAdaptertroca fácil

Arraste para o lado para ver o diagrama inteiro.

Os pacotes atravessam o adaptador, que converte nomes, unidades e tipos; trocar de fornecedor é trocar o adaptador.

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

✓ ExemploTypeScript
// 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

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →