Tópico 09 - Adapter

Tópico 09 - Adapter

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Motivação

  • Sistemas evoluem e precisam integrar terceiros
  • Nem toda biblioteca fala a mesma linguagem
  • Reescrever tudo quase nunca é viável
  • Precisamos reaproveitar código útil
  • O cliente deve continuar estável
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Problema

  • Sistema atual recebe XML
  • Biblioteca nova entende apenas JSON
  • Interfaces não combinam
  • Mudanças diretas espalham impacto
  • Código cliente fica acoplado ao fornecedor
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Conceito principal

  • Adapter é um padrão estrutural
  • Ele converte uma interface em outra
  • O cliente usa a interface esperada
  • O serviço real continua intocado
  • A tradução fica isolada no adaptador
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Como funciona

  • O cliente chama uma interface conhecida
  • O adaptador implementa essa interface
  • Internamente, ele traduz a chamada
  • Depois delega ao serviço incompatível
  • Resultado volta no formato esperado
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Papéis no padrão

  • Client usa uma interface esperada
  • Target define o contrato desejado
  • Adaptee é o serviço incompatível
  • Adapter traduz e delega
  • Foco: compatibilidade sem quebrar o cliente
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Exemplo conceitual

  • Portal financeiro espera JSON
  • Sistema legado fornece XML
  • Não podemos alterar o legado
  • Criamos um tradutor entre os dois
  • O cliente continua consumindo JSON
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Código: contrato esperado

interface ProvedorRelatorio {
    String obterRelatorioEmJson();
}
  • O cliente depende do contrato Target
  • Nada de acoplamento ao legado
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Código: serviço incompatível

class SistemaLegadoXml {
    public String obterRelatorioEmXml() {
        return "<relatorio><total>150</total></relatorio>";
    }
}
  • Classe útil, mas incompatível
  • Queremos reutilizar sem modificar
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Código: adaptador

class XmlParaJsonAdapter implements ProvedorRelatorio {
    private SistemaLegadoXml sistemaLegado;

    public String obterRelatorioEmJson() {
        String xml = sistemaLegado.obterRelatorioEmXml();
        return "{ \"total\": 150 }";
    }
}
  • O adaptador traduz formatos
  • O cliente recebe o que espera
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Analogia

  • Plugue brasileiro e tomada europeia
  • Equipamentos continuam os mesmos
  • O adaptador faz o encaixe funcionar
  • Ele traduz a interface física
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Quando usar

  • Integrar código legado
  • Reaproveitar bibliotecas externas
  • Compatibilizar APIs diferentes
  • Isolar regras de conversão
  • Evitar mudanças no cliente principal
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Quando não usar

  • Quando a interface pode ser refatorada facilmente
  • Quando não há incompatibilidade real
  • Quando o adaptador vira lógica de negócio
  • Quando a camada extra só complica
  • Quando composição simples já resolve
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Vantagens

  • Reaproveita código existente
  • Reduz acoplamento com terceiros
  • Centraliza conversões
  • Facilita evolução do sistema
  • Protege o cliente de mudanças externas
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Desvantagens

  • Adiciona novas classes
  • Pode aumentar a complexidade geral
  • Não corrige design ruim
  • Adaptadores grandes viram problema
  • Uso excessivo cria camadas artificiais
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Relações com outros padrões

  • Facade simplifica subsistemas inteiros
  • Decorator mantém a interface base
  • Proxy controla acesso, sem traduzir
  • Bridge separa abstração e implementação
  • Adapter traduz interfaces incompatíveis
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Exemplo prático

Notificador n = new SmsAdapter(new ServicoLegadoSms());
NotificadorTurma app = new NotificadorTurma(n);
app.avisarInicioDasAulas();
  • O cliente usa Notificador
  • O legado continua intacto
  • A tradução fica no SmsAdapter
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 09 - Adapter

Resumo final

  • Adapter traduz uma interface em outra
  • Resolve integração sem reescrever tudo
  • Muito útil com legado e terceiros
  • Deve focar em compatibilidade
  • Menos acoplamento, mais reaproveitamento
Design Patterns - Professor Ramon Venson - SATC 2026.1