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