Lista de Exercícios 020: Visitor
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 Visitor é ou não uma boa escolha. Em cada caso, classifique como adequada ou não adequada e justifique brevemente.
- Situação 1: um sistema mantém uma árvore de elementos de relatório e precisa adicionar exportação para HTML, Markdown e JSON sem misturar esses comportamentos às classes do domínio.
- Situação 2: uma classe
Calculadorapossui apenas os métodossomaresubtrair, sem hierarquia de elementos nem múltiplas operações por tipo. - Situação 3: um compilador educacional precisa percorrer uma árvore sintática para validar tipos, gerar código intermediário e coletar métricas.
- Situação 4: uma hierarquia de elementos recebe novos tipos concretos toda semana, enquanto quase não surgem operações novas.
- Situação 5: um sistema de formulários possui componentes heterogêneos e precisa gerar relatórios e validações diferentes sobre a mesma estrutura.
Exercício 2 : Double dispatch
Seção intitulada “Exercício 2 : Double dispatch”Explique com suas palavras por que o padrão Visitor costuma depender de double dispatch.
Na resposta, comente:
- por que chamar apenas um método sobrecarregado no visitante não resolve o problema sozinho
- qual é o papel do método
aceitar(visitor) - como o tipo concreto do elemento influencia na escolha do método visitante
Exercício 3 : Múltipla escolha
Seção intitulada “Exercício 3 : Múltipla escolha”Uma equipe possui uma hierarquia com Texto, Tabela e Grafico. Agora ela quer adicionar exportação para PDF e uma coleta de métricas sem alterar constantemente essas classes. Qual alternativa descreve melhor o uso do padrão?
A. Criar uma interface Visitor, adicionar aceitar(visitor) aos elementos e implementar visitantes concretos para cada novo comportamento.
B. Substituir toda a hierarquia por uma única classe Object com vários if e instanceof no código cliente.
C. Usar Singleton para garantir que exista apenas um exportador para toda a aplicação.
D. Colocar todos os métodos de exportação e métricas dentro de cada classe concreta para evitar objetos extras.
Gabarito: alternativa A.
Exercício 4 : Código com problema
Seção intitulada “Exercício 4 : Código com problema”Leia o código abaixo, identifique o problema conceitual de coesão e extensão e sugira como melhorá-lo em alto nível usando Visitor.
interface ElementoRelatorio { String exportarHtml(); String exportarMarkdown(); int contarPalavras();}
class Texto implements ElementoRelatorio { private final String conteudo;
public Texto(String conteudo) { this.conteudo = conteudo; }
public String exportarHtml() { return "<p>" + conteudo + "</p>"; }
public String exportarMarkdown() { return conteudo; }
public int contarPalavras() { return conteudo.split("\\s+").length; }}Considere na resposta os conceitos de elemento, visitante, aceitar(visitor), double dispatch e separação de comportamentos auxiliares.
Exercício 5 : Implementação simples
Seção intitulada “Exercício 5 : Implementação simples”Implemente uma solução simples usando Visitor para um sistema acadêmico de avaliação.
- Crie uma interface
ElementoAvaliacaocom o métodoaceitar(Visitor visitor). - Crie ao menos duas classes concretas, como
QuestaoObjetivaeQuestaoDiscursiva. - Crie uma interface
Visitorcom um método para cada tipo concreto. - Implemente um visitante chamado
GeradorResumoVisitor. - No
main, monte uma pequena estrutura com alguns elementos e aplique o visitante. - Mostre no resultado que o comportamento muda conforme o tipo concreto visitado.