using System;
public interface IOrder
{
decimal CalculateTotal();
}
public class BasicOrder : IOrder
{
private decimal _orderAmount;
public BasicOrder(decimal orderAmount)
{
_orderAmount = orderAmount;
}
public decimal CalculateTotal()
{
return _orderAmount;
}
}
public abstract class OrderDecorator : IOrder
{
protected IOrder _order;
public OrderDecorator(IOrder order)
{
_order = order;
}
public virtual decimal CalculateTotal()
{
return _order.CalculateTotal();
}
}
public class DiscountDecorator : OrderDecorator
{
private decimal _discountPercentage;
public DiscountDecorator(IOrder order, decimal discountPercentage)
: base(order)
{
_discountPercentage = discountPercentage;
}
public override decimal CalculateTotal()
{
var total = base.CalculateTotal();
return total - (total * _discountPercentage / 100);
}
}
public class ServiceChargeDecorator : OrderDecorator
{
private decimal _serviceCharge;
public ServiceChargeDecorator(IOrder order, decimal serviceCharge)
: base(order)
{
_serviceCharge = serviceCharge;
}
public override decimal CalculateTotal()
{
var total = base.CalculateTotal();
return total + _serviceCharge;
}
}
class Program
{
static void Main()
{
IOrder order = new BasicOrder(100);
order = new DiscountDecorator(order, 10);
order = new ServiceChargeDecorator(order, 5);
decimal total = order.CalculateTotal();
Console.WriteLine($"Total final: {total}");
}
}