Pular para o conteúdo

Lista de Exercícios 008: Bridge

Considere um sistema de notificações que varia em duas dimensões independentes:

  • tipo de notificação: simples e urgente
  • canal de envio: e-mail, SMS e push

Explique:

  1. Por que o padrão Bridge é apropriado para esse cenário.
  2. Qual seria o problema de modelar tudo apenas com herança.
  3. Como a separação entre abstração e implementação ajuda na manutenção do sistema.

O código abaixo tenta resolver o problema com herança, mas gera uma estrutura pouco escalável. Refatore conceitualmente para usar Bridge.

abstract class Notificacao {}
class NotificacaoSimplesEmail extends Notificacao {
void enviar() { System.out.println("Simples por email"); }
}
class NotificacaoSimplesSms extends Notificacao {
void enviar() { System.out.println("Simples por SMS"); }
}
class NotificacaoUrgenteEmail extends Notificacao {
void enviar() { System.out.println("Urgente por email"); }
}
class NotificacaoUrgenteSms extends Notificacao {
void enviar() { System.out.println("Urgente por SMS"); }
}
  1. Criar uma abstração Notificacao.
  2. Criar uma interface de implementação CanalEnvio.
  3. Permitir que novos tipos de notificação e novos canais sejam adicionados separadamente.

Implemente o padrão Bridge para um sistema de relatórios acadêmicos com duas dimensões:

  • tipo de relatório: RelatorioResumo e RelatorioDetalhado
  • formato de saída: PdfExportador e HtmlExportador
  1. Crie a interface Exportador com um método exportar(String conteudo).
  2. Implemente PdfExportador e HtmlExportador.
  3. Crie uma abstração Relatorio que receba um Exportador no construtor.
  4. Crie pelo menos duas abstrações refinadas: RelatorioResumo e RelatorioDetalhado.
  5. Demonstre o uso com um main.

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

  1. Um sistema precisa combinar tipos de controle remoto com vários dispositivos.
  2. Uma aplicação quer adaptar uma API legada para o contrato atual.
  3. Um software possui duas dimensões independentes: tela administrativa/comum e plataforma Windows/Linux.
  4. Um módulo quer apenas trocar um algoritmo de cálculo mantendo a mesma estrutura principal.