Console.WriteLine(this.GetType().Name);
public class Water : Void
public class Vanilla : Void
public class Chocolate : Void
public class Strawberry : Void
public class Coffee : Void
public interface IService<Out, In>
internal class EmptyOrder<Out> : IService<Out, Customer> where Out : class
private IService<Out, Customer> _base;
public EmptyOrder(IService<Out, Customer> service)
public Out Serve(Customer input)
var output = _base.Serve(input);
internal class WaterOrder<Out> : IService<Water, Customer>
private IService<Out, Customer> _base;
public WaterOrder(IService<Out, Customer> service)
public Water Serve(Customer _)
internal class MilkOrder : IService<Milk, Customer>
public Milk Serve(Customer _)
internal class CoffeeOrder<Out> : IService<Coffee, Customer>
private IService<Out, Customer> _base;
public CoffeeOrder(IService<Out, Customer> service)
public Coffee Serve(Customer _)
public abstract class CoffeehouseOrder : IService<Void, Customer>
private IService<Coffee, Customer> _order;
private IService<Water, Customer> _waterOrder;
public CoffeehouseOrder() : this(new CoffeeOrder<Void>())
public CoffeehouseOrder(IService<Coffee, Customer> order)
public CoffeehouseOrder(IService<Water, Customer> order)
public Void Serve(Customer customer)
Console.WriteLine("---Prepare");
_waterOrder.Serve(customer);
Console.WriteLine("---Served\n");
public class ExpressoOrder : CoffeehouseOrder
public class DoubleExpressoOrder : CoffeehouseOrder
public class LatteOrder : CoffeehouseOrder
public class LongBlackOrder : CoffeehouseOrder
public class CappucinoOrder : CoffeehouseOrder
public class AmericanoOrder : CoffeehouseOrder
public static void Main()
var customer = new Customer();
Console.WriteLine("An expresso please !");
var expressoOrder = new ExpressoOrder();
expressoOrder.Serve(customer);
Console.WriteLine("A latte please !");
var latteOrder = new LatteOrder();
latteOrder.Serve(customer);
Console.WriteLine("A double expresso please !");
var doubleExpressoOrder = new DoubleExpressoOrder();
doubleExpressoOrder.Serve(customer);
Console.WriteLine("An americano please !");
var americanoOrder = new AmericanoOrder();
americanoOrder.Serve(customer);