using System.Collections.Generic;
public static void Main()
var productos = new List<Producto>()
new Producto("Remera", 5, 800), new Producto("Pantalon", 2, 1200), new Producto("Zapatilla", 4, 2500)
var clientePremium = new Cliente("Gonzalo", 5, true, productos, new PromocionClientePremium());
var clienteAntiguedad = new Cliente("Gonzalo", 8, true, productos, new PromocionPorAntiguedad());
var clienteCantidad = new Cliente("Gonzalo", 5, true, productos, new PromocionPorCantidad());
var saldoAPagarPremium = clientePremium.SaldoAPagar();
var saldoAPagarAntiguedad = clienteAntiguedad.SaldoAPagar();
var saldoAPagarCantidad = clienteCantidad.SaldoAPagar();
Console.WriteLine("Saldo a pagar premium: " + saldoAPagarPremium);
Console.WriteLine("Saldo a pagar por antiguedad: " + saldoAPagarAntiguedad);
Console.WriteLine("Saldo a pagar por cantidad: " + saldoAPagarCantidad);
public interface IPromocion {
double aplicar(Cliente cliente);
public class PromocionPorCantidad : IPromocion
public double aplicar(Cliente cliente)
var cantidad = cliente.Productos.Sum(x => x.Cantidad);
var costoTotal = cliente.Productos.Sum(x => x.CostoTotal());
return costoTotal - costoTotal * 0.25;
public class PromocionClientePremium : IPromocion
public double aplicar(Cliente cliente)
var cantidad = cliente.Productos.Sum(x => x.Cantidad);
var costoTotal = cliente.Productos.Sum(x => x.CostoTotal());
if (cliente.ClientePremium)
return costoTotal - costoTotal * 0.5;
public class PromocionPorAntiguedad : IPromocion
public double aplicar(Cliente cliente)
var costoTotal = cliente.Productos.Sum(x => x.CostoTotal());
if (cliente.AniosAntiguedad == 1)
return costoTotal - costoTotal * 0.3;
if (cliente.AniosAntiguedad > 5)
return costoTotal - costoTotal * 0.1;
private string nombre { get; set; }
public int AniosAntiguedad { get; set; }
public bool ClientePremium {get; set; }
public List<Producto> Productos { get; set; }
private IPromocion promocion { get; set; }
public Cliente(string nombre, int aniosAntiguedad, bool clientePremium, List<Producto> productos, IPromocion promocion)
this.AniosAntiguedad = aniosAntiguedad;
this.ClientePremium = clientePremium;
this.Productos = productos;
this.promocion = promocion;
public double SaldoAPagar()
return this.promocion.aplicar(this);
private string nombre { get; set; }
public int Cantidad {get; set; }
private double precio { get; set; }
public Producto(string nombre, int cantidad, double precio)
this.Cantidad = cantidad;
public double CostoTotal()
return this.precio * this.Cantidad;