Pular para o conteúdo

Lista de Exercícios 010: Decorator

Analise cada situação e diga se o padrão Decorator é ou não uma boa escolha. Em cada caso, classifique como adequada ou não adequada e justifique brevemente.

  1. Situação 1: uma biblioteca de notificações precisa permitir combinações variáveis de email, SMS e Slack conforme o perfil do usuário.
  2. Situação 2: um sistema tem uma regra fixa de cálculo de imposto que sempre será executada da mesma forma para todos os pedidos.
  3. Situação 3: um componente visual pode receber borda, barra de rolagem e sombra de forma opcional e combinável.
  4. Situação 4: uma API precisa traduzir objetos XML de um fornecedor para a interface JSON esperada pelo cliente.
  5. Situação 5: um pipeline de leitura de arquivos pode ativar compressão, criptografia e cache em diferentes combinações.

Leia o código abaixo, identifique o problema conceitual relacionado à extensão de comportamento e sugira como melhorá-lo em alto nível usando Decorator.

class Notificador {
public void enviar(String mensagem) {
System.out.println("Email: " + mensagem);
}
}
class NotificadorEmailSmsSlack extends Notificador {
@Override
public void enviar(String mensagem) {
System.out.println("Email: " + mensagem);
System.out.println("SMS: " + mensagem);
System.out.println("Slack: " + mensagem);
}
}
class NotificadorEmailPushSlack extends Notificador {
@Override
public void enviar(String mensagem) {
System.out.println("Email: " + mensagem);
System.out.println("Push: " + mensagem);
System.out.println("Slack: " + mensagem);
}
}

Uma equipe quer adicionar compressão e criptografia a um fluxo de gravação de dados sem alterar a classe original de escrita em arquivo. Além disso, as duas funcionalidades devem poder ser combinadas em ordens diferentes conforme o ambiente. Qual alternativa descreve melhor a solução mais adequada?

a. Usar Decorator para envolver o componente base com camadas de compressão e criptografia mantendo a mesma interface.

b. Usar Singleton para garantir que exista apenas uma versão do gravador de arquivos.

c. Usar Adapter para trocar a interface de escrita por outra incompatível.

d. Usar Factory Method para eliminar a necessidade de compor funcionalidades em execução.

e. Usar Strategy para escolher dinamicamente a implementação de escrita sem criar camadas de decoração.

Implemente uma solução simples usando Decorator para representar notificações em um sistema acadêmico.

  • Crie uma interface Notificador com o método void enviar(String mensagem).
  • Crie uma classe base EmailNotificador com o comportamento mínimo.
  • Crie um decorador base que receba outro Notificador no construtor.
  • Crie pelo menos um decorador concreto, como SmsDecorator ou PushDecorator.
  • No main, monte uma combinação com pelo menos duas camadas de notificação.
  • Exiba no console a ordem em que as mensagens são enviadas.