public interface IProduct
{
decimal BasePrice { get; }
decimal SalesPrice { get; }
decimal GoldLevelDiscount { get; }
bool IsOnSale { get; }
}
public interface ICustomer
{
bool HasFixedDiscountAgreement { get; }
decimal FixedDiscount { get; }
bool IsGoldLevelCustomer { get; }
}
public class Pricer
{
private List<IPriceCalculator> _calculators = new List<IPriceCalculator>
{
new GoldLevelPriceCalculator(),
new SalePriceCalculator()
};
public decimal GetPrice(IProduct product, ICustomer customer)
{
decimal price = product.BasePrice;
foreach (IPriceCalculator calculator in _calculators)
{
price = calculator.CalculatePrice(price, customer, product);
}
return price;
}
}
public interface IPriceCalculator
{
decimal CalculatePrice(decimal price, ICustomer customer, IProduct product);
}
public class GoldLevelPriceCalculator: IPriceCalculator
{
public decimal CalculatePrice(decimal price, ICustomer customer, IProduct product)
{
if (customer.IsGoldLevelCustomer)
{
price = price*(1 - product.GoldLevelDiscount);
}
return price;
}
}
public class SalePriceCalculator: IPriceCalculator
{
public decimal CalculatePrice(decimal price, ICustomer customer, IProduct product)
{
if (product.IsOnSale && !customer.HasFixedDiscountAgreement)
{
price = product.SalesPrice < price ? product.SalesPrice : price;
}
return price;
}
}