public void DecoratorTest() { DIServiceLocator.Current.RegisterInstance(typeof(ITextProvider)); Support.Configure(); Beverage beverage = new Espresso(); beverage = new Mocha(beverage); Assert.AreEqual(beverage.Description, "Espresso, Mocha"); Assert.AreEqual(beverage.Cost(), 2.19); Beverage beverage2 = new DarkRoast(); beverage2 = beverage2.AddComponent <Mocha>(); beverage2 = beverage2.AddComponent <Mocha>(); beverage2 = beverage2.AddComponent <Whip>(); Assert.AreEqual(beverage2.Description, "Dark Roast, Mocha, Mocha, Whip"); Assert.AreEqual(beverage2.Cost(), 1.49); Beverage beverage3 = new HouseBlend(); SupportExtensions.AddComponent <Soy>(ref beverage3); SupportExtensions.AddComponent <Mocha>(ref beverage3); SupportExtensions.AddComponent <Whip>(ref beverage3); Assert.AreEqual(beverage3.Description, "House Blend Coffee, Soy, Mocha, Whip"); Assert.AreEqual(beverage3.Cost(), 1.34); }
public void CostIsComputedWithMocha() { DarkRoast darkRoast = new DarkRoast(); CondimentDecorator darkRoastWithMocha = new Mocha(darkRoast); Assert.That(darkRoastWithMocha.Cost(), Is.EqualTo(2.5)); }
/// <summary> /// # Motivation /// I can now attach responsibilities to an object dynamically to add behaviour at runtime. /// /// # Structure /// Beverage /// --> base class so all objects are of same type /// CondimentDecorator : Bevarage /// --> interchangeable with Beverage /// /// # Sample Problem /// A coffee shop wants to make an ordering system for all their drinks. Ofcourse there are a lot of combination with condiments/roasts. /// We could create a base class and let all possible combinations inherit from the superclass and override their behaviour, but that would quickly become a mess. /// /// # Solution /// By creating a Decorator class which inherits from the baseclass (to effectively swap between types), I can now dynamically create composite objects at runtime. /// To add a drink to the system: /// 1. inherit from the base class, set instance fields in constructor /// 2. override the 'Cost()' method to return desired cost /// To add a condiment to the system: /// 1. inherit from 'CondimentDecorator' (indirectly from base class as well /// 2. add instance field from type Beverage /// 3. initialize in constructor /// 4. override GetDescription() and Cost() accordingly /// To create a composite object at runtime: /// 1. Create a new instance of a drink (Beverage) /// 2. To add a condiment, assign the instance to a new instance of the condiment with itself as param /// A. Beverage darkRoast = new DarkRoast(); /// B. darkRoast = new Mocha(darkRoast); /// </summary> public void Test() { Beverage beverage = new Espresso(); Console.WriteLine($"{beverage.GetDescription()} ${beverage.Cost()}"); Beverage beverage1 = new DarkRoast(); beverage1 = new Mocha(beverage1); Console.WriteLine($"{beverage1.GetDescription()} ${beverage1.Cost()}"); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); Console.WriteLine($"{beverage2.GetDescription()} ${beverage2.Cost()}"); beverage2 = new Mocha(beverage2); Console.WriteLine($"{beverage2.GetDescription()} ${beverage2.Cost()}"); beverage2 = new Whip(beverage2); Console.WriteLine($"{beverage2.GetDescription()} ${beverage2.Cost()}"); Beverage beverage3 = new HouseBlend(); beverage3 = new Soy(beverage3); beverage3 = new Mocha(beverage3); beverage3 = new Whip(beverage3); Console.WriteLine($"{beverage3.GetDescription()} ${beverage3.Cost()}"); }
static void Main(string[] args) { Beverage beverage = new Espresso(); Console.WriteLine("{0} ${1}", beverage.GetDescription(), beverage.Cost()); beverage.SetSize(3); Console.WriteLine("{0} ${1}", beverage.GetDescription(), beverage.Cost()); Beverage beverage2 = new Mocha(beverage); Console.WriteLine("{0} ${1}", beverage2.GetDescription(), beverage2.Cost()); beverage2 = new Mocha(beverage2); Console.WriteLine("{0} ${1}", beverage2.GetDescription(), beverage2.Cost()); beverage2.SetSize(2); Console.WriteLine("{0} ${1}", beverage2.GetDescription(), beverage2.Cost()); Console.ReadKey(); }
public void Cost_WithMocha_ReturnTwoDollarAndNineteenCents() { Beverage espresso = new Espresso(); espresso = new Mocha(espresso); var cost = espresso.Cost(); cost.Should().Be(2.19m); }
public void Cost_WithMocha_ReturnOneDollarAndTwentyFiveCents() { Beverage decaf = new Decaf(); decaf = new Mocha(decaf); var cost = decaf.Cost(); cost.Should().Be(1.25m); }
public void Cost_WithMocha_ReturnOneDollarAndNineteenCents() { Beverage darkRoastCoffee = new DarkRoast(); darkRoastCoffee = new Mocha(darkRoastCoffee); var cost = darkRoastCoffee.Cost(); cost.Should().Be(1.19m); }
public void TestExpressoWithSize() { BeverageSize beverageSize = BeverageSize.GRANDE; Beverage beverage = new Expresso(); beverage.Size = beverageSize; beverage = new Mocha(beverage); beverage.Size = beverageSize; Assert.AreEqual("Expresso, Mocha $1.9", beverage.GetDescription() + " $" + beverage.Cost()); }
static void DecoratorInvoke() { Beverage beverage = new DarkRoast(); // 焦烤咖啡 Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost()); beverage = new Mocha(beverage); //添加摩卡 Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost()); beverage = new Milk(beverage); //添加牛奶 Console.WriteLine(beverage.GetDescription() + " $" + beverage.Cost()); Beverage beverage2 = new Milk(new HouseBlend()); // 家庭混合咖啡加摩卡加牛奶 Console.WriteLine(beverage2.GetDescription() + " $" + beverage2.Cost()); }
static void Main(string[] args) { Beverage beverage = new Espresso(); Console.WriteLine($"{beverage.GetDescription()} ${beverage.Cost()}"); Beverage beverage1 = new HouseBlend(); beverage1 = new Soy(beverage1); beverage1 = new Mocha(beverage1); beverage1 = new Mocha(beverage1); Console.WriteLine($"{beverage1.GetDescription()} ${beverage1.Cost()}"); Console.ReadLine(); }
public void Expresso_ShouldBeExpressoAndCostThreeDollarsAndTwentyCents_WhithMochaAndVenti() { //Arrange BeverageSize beverageSize = BeverageSize.VENTI; Beverage beverage = new Expresso(); beverage.Size = beverageSize; beverage = new Mocha(beverage); beverage.Size = beverageSize; //Act var description = beverage.GetDescription(); var cost = beverage.Cost(); //Assert description.Should().Be("Expresso, Mocha"); cost.Should().Be(3.2); }
public static void TestDecorate() { Console.WriteLine("\n\n\n--------------------测试装饰者模式--------------------"); //客人点了一杯espresso Beverage espresso = new Espresso(); //客人点了一杯拿铁 Beverage natie = new NaTie(); espresso = new Milk(espresso);//添加牛奶 espresso = new Sugar(espresso);//添加糖 var desEspresso = espresso.getDescription(); var costEspresso = espresso.Cost(); Console.WriteLine("{0}共花费了{1}元", desEspresso, costEspresso); natie = new Milk(natie);//加奶 natie = new Milk(natie);//加奶 natie = new Sugar(natie);//加糖 natie = new Mocha(natie);//加摩卡 var desNatie = natie.getDescription(); var costNatie = natie.Cost(); Console.WriteLine("{0}共花费了{1}元", desNatie, costNatie); }
public static void Start() { DIServiceLocator.Current.RegisterInstance <IPriceProvider>(new ComponentCosts()); Beverage beverage = new Espresso(); beverage = new Mocha(beverage); "{0} ${1}".P(beverage.Description, beverage.Cost()); Beverage beverage2 = new DarkRoast(); beverage2 = beverage2.AddComponent <Mocha>(); beverage2 = beverage2.AddComponent <Mocha>(); beverage2 = beverage2.AddComponent <Whip>(); "{0} ${1}".P(beverage2.Description, beverage2.Cost()); Beverage beverage3 = new HouseBlend(); SupportExtensions.AddComponent <Soy>(ref beverage3); SupportExtensions.AddComponent <Mocha>(ref beverage3); SupportExtensions.AddComponent <Whip>(ref beverage3); "{0} ${1}".P(beverage3.Description, beverage3.Cost()); }