Pular para o conteúdo

Lista de Exercícios 020: Visitor

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.

  1. 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.
  2. Situação 2: uma classe Calculadora possui apenas os métodos somar e subtrair, sem hierarquia de elementos nem múltiplas operações por tipo.
  3. Situação 3: um compilador educacional precisa percorrer uma árvore sintática para validar tipos, gerar código intermediário e coletar métricas.
  4. Situação 4: uma hierarquia de elementos recebe novos tipos concretos toda semana, enquanto quase não surgem operações novas.
  5. 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.

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

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.

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.

Implemente uma solução simples usando Visitor para um sistema acadêmico de avaliação.

  • Crie uma interface ElementoAvaliacao com o método aceitar(Visitor visitor).
  • Crie ao menos duas classes concretas, como QuestaoObjetiva e QuestaoDiscursiva.
  • Crie uma interface Visitor com 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.