public static void Main()
var orderDiscount = OrderDiscountFactory.GetOrderDiscount();
var discount = orderDiscount.CheckForDiscount(p, q);
Console.WriteLine(discount);
Console.WriteLine("Price is: {0}", p * q * (1 - discount ));
public static class OrderDiscountFactory
public static OrderDiscount GetOrderDiscount()
var orderDiscount = new OneThousandDollarBikeDiscount();
orderDiscount.SetNext(new TwoThousandDollarBikeDiscount())
.SetNext(new FiveThousandDollarBikeDiscount())
.SetNext(new OverTenDiscount());
public abstract class OrderDiscount
protected OrderDiscount next;
public OrderDiscount SetNext(OrderDiscount nextDiscount)
public double CheckForDiscount(int price, int quantity)
discount = GetDiscount(price, quantity);
discount += next.CheckForDiscount(price, quantity);
abstract protected double GetDiscount(int price, int quantity);
public class OneThousandDollarBikeDiscount : OrderDiscount
protected override double GetDiscount(int price, int quantity)
Console.WriteLine("Testing $1000");
if (price == 1000 && quantity >= 20)
public class TwoThousandDollarBikeDiscount : OrderDiscount
protected override double GetDiscount(int price, int quantity)
Console.WriteLine("Testing $2000");
if (price == 2000 && quantity >= 10)
public class FiveThousandDollarBikeDiscount : OrderDiscount
protected override double GetDiscount(int price, int quantity)
Console.WriteLine("Testing $5000");
if (price == 5000 && quantity >= 5)
public class OverTenDiscount : OrderDiscount
protected override double GetDiscount(int price, int quantity)
Console.WriteLine("Checking Over Ten Discount");