Lista de Exercícios 007: Adapter
Exercício 1: Reflexão
Seção intitulada “Exercício 1: Reflexão”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:
- Por que o Adapter é apropriado para esse cenário.
- Qual é a interface esperada pelo cliente e qual é a interface incompatível.
- Quais benefícios e custos você espera ao introduzir um adaptador nessa solução.
Exercício 2: Código com má implementação
Seção intitulada “Exercício 2: Código com má implementaçã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.
Código inicial (ruim)
Seção intitulada “Código inicial (ruim)”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); }}O que sua refatoração deve alcançar
Seção intitulada “O que sua refatoração deve alcançar”- Criar uma interface
Notificadorcom o métodoenviar(String destinatario, String mensagem). - Implementar um adaptador
SmsAdapterpara encapsularServicoLegadoSms. - Fazer
NotificadorTurmadepender apenas da interfaceNotificador.
Exercício 3: Implementação
Seção intitulada “Exercício 3: Implementação”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>"; }}Requisitos
Seção intitulada “Requisitos”- Crie um adaptador chamado
XmlJsonAdapter. - O adaptador deve implementar
Exportador. - Internamente, ele deve usar
SistemaXmlLegado. - O método
exportarJson()deve devolver uma string JSON equivalente. - Crie uma classe cliente
PainelRelatoriosque recebaExportadorvia construtor. - Demonstre o uso com um
main.
Exercício 4: Identificação do padrão
Seção intitulada “Exercício 4: Identificação do padrão”Para cada situação abaixo, diga se Adapter é ou não uma boa escolha e justifique:
- Uma aplicação usa uma SDK de pagamento com métodos diferentes dos esperados pelo domínio da aplicação.
- Uma equipe quer adicionar logs extras a uma classe sem mudar sua interface pública.
- Um sistema precisa manter a interface atual enquanto integra um serviço legado com contrato incompatível.
- Um módulo quer simplificar o acesso a vários serviços diferentes por meio de uma única interface unificada.