1
resposta

De acordo com a aula sobre o padrão Visitor, eu fiz esse exemplo. Gostaria de saber se está ok ??!!!

 public interface IVisitor
    {

        double Visita(Produto produto);

    }


 public class Produto
    {

        private string nome;
        private double preco;
        private double valorFrete;
        private double acrescimo;


        public Produto(string nome,double preco,double valorFrete,double acrescimo)
        {
            this.nome = nome;
            this.preco = preco;
            this.valorFrete = valorFrete;
            this.acrescimo = acrescimo;
        }

        public object Aceita(IVisitor visitor)
        {
            return visitor.Visita(this);
        }

        public double GetPreco()
        {
            return this.preco;
        }

        public double GetValorFrete()
        {
            return this.preco + this.valorFrete;
        }

        public double GetAcrescimo()
        {
            return this.preco + this.valorFrete + this.acrescimo;
        }

    }

  public class LojaVisitor : IVisitor
    {
        public double Visita(Produto produto)
        {
            return produto.GetPreco();
        }
    }

  public class SiteVisitor : IVisitor
    {
        public double Visita(Produto produto)
        {
            return produto.GetPreco() +
                produto.GetValorFrete() + 
                produto.GetAcrescimo();
        }
    }

  public class TelefoneVisitor : IVisitor
    {
        public double Visita(Produto produto)
        {
            return produto.GetPreco() + produto.GetValorFrete();
        }
    }

 class Program
    {
        static void Main(string[] args)
        {

            Produto produto = new Produto("Computador", 1500, 50, 4.5);

            LojaVisitor valorLoja = new LojaVisitor();
            SiteVisitor valorSite = new SiteVisitor();
            TelefoneVisitor valorTelefone = new TelefoneVisitor();

            Console.WriteLine("Valor na loja: " + produto.Aceita(valorLoja));
            Console.WriteLine("Valor por telefone: " + produto.Aceita(valorTelefone));
            Console.WriteLine("Valor pelo site: " + produto.Aceita(valorSite));


        }
    }
1 resposta

Oi Mauricio, tudo bom?

Me parece que o padrão de projeto Visitor é focado em varrer arvores, nesse caso, estamos apenas resgatando o valor do produto em certos casos.

Todo padrão de projeto tem um problema para resolver, por mais que a estrutura seja a mesma, de receber uma instancia para tomada de decisão, é outro contexto portanto o padrão não se aplica.

Entretando, essa implementação é muito melhor do que realizar alguns varios ifs no main, já que você trabalha com polimorfismo para chamar o valor certo.

Abraço e bons estudos =)