Pular para o conteúdo

Lista de Exercícios 007: Adapter

Considere um sistema acadêmico que foi desenvolvido para enviar notificações por e-mail. Agora a equipe precisa integrar um serviço legado que envia apenas SMS, usando uma interface totalmente diferente da esperada pelo sistema atual.

Explique:

  1. Por que o Adapter é apropriado para esse cenário.
  2. Qual é a interface esperada pelo cliente e qual é a interface incompatível.
  3. Quais benefícios e custos você espera ao introduzir um adaptador nessa solução.

O código abaixo mistura lógica de negócio com lógica de conversão e acopla diretamente o cliente ao sistema legado. Refatore para usar Adapter, de forma que o cliente dependa apenas de uma interface estável.

class ServicoLegadoSms {
public void sendSms(String numero, String texto) {
System.out.println("SMS enviado para " + numero + ": " + texto);
}
}
class NotificadorTurma {
private ServicoLegadoSms sms = new ServicoLegadoSms();
public void avisarAluno(String telefone, String mensagem) {
String numeroFormatado = "+55" + telefone;
sms.sendSms(numeroFormatado, mensagem);
}
}
  1. Criar uma interface Notificador com o método enviar(String destinatario, String mensagem).
  2. Implementar um adaptador SmsAdapter para encapsular ServicoLegadoSms.
  3. Fazer NotificadorTurma depender apenas da interface Notificador.

Implemente o padrão Adapter para um sistema de relatórios que espera trabalhar com a interface abaixo:

interface Exportador {
String exportarJson();
}

Mas o serviço disponível é legado e oferece esta interface:

class SistemaXmlLegado {
public String exportarXml() {
return "<dados><nome>Relatório</nome></dados>";
}
}
  1. Crie um adaptador chamado XmlJsonAdapter.
  2. O adaptador deve implementar Exportador.
  3. Internamente, ele deve usar SistemaXmlLegado.
  4. O método exportarJson() deve devolver uma string JSON equivalente.
  5. Crie uma classe cliente PainelRelatorios que receba Exportador via construtor.
  6. Demonstre o uso com um main.

Para cada situação abaixo, diga se Adapter é ou não uma boa escolha e justifique:

  1. Uma aplicação usa uma SDK de pagamento com métodos diferentes dos esperados pelo domínio da aplicação.
  2. Uma equipe quer adicionar logs extras a uma classe sem mudar sua interface pública.
  3. Um sistema precisa manter a interface atual enquanto integra um serviço legado com contrato incompatível.
  4. Um módulo quer simplificar o acesso a vários serviços diferentes por meio de uma única interface unificada.