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));
        }
    }