Lista de Exercícios 010: Decorator
Exercício 1 : Situações para análise
Seção intitulada “Exercício 1 : Situações para análise”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.
- 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.
- 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.
- Situação 3: um componente visual pode receber borda, barra de rolagem e sombra de forma opcional e combinável.
- Situação 4: uma API precisa traduzir objetos XML de um fornecedor para a interface JSON esperada pelo cliente.
- Situação 5: um pipeline de leitura de arquivos pode ativar compressão, criptografia e cache em diferentes combinações.
Exercício 2 : Código com problema
Seção intitulada “Exercício 2 : Código com problema”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); }}Exercício 3 : Múltipla escolha
Seção intitulada “Exercício 3 : Múltipla escolha”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.
Exercício 4 : Implementação simples
Seção intitulada “Exercício 4 : Implementação simples”Implemente uma solução simples usando Decorator para representar notificações em um sistema acadêmico.
- Crie uma interface
Notificadorcom o métodovoid enviar(String mensagem). - Crie uma classe base
EmailNotificadorcom o comportamento mínimo. - Crie um decorador base que receba outro
Notificadorno construtor. - Crie pelo menos um decorador concreto, como
SmsDecoratorouPushDecorator. - 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.