コード例 #1
0
        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);
        }
コード例 #2
0
        public void CostIsComputedWithMocha()
        {
            DarkRoast          darkRoast          = new DarkRoast();
            CondimentDecorator darkRoastWithMocha = new Mocha(darkRoast);

            Assert.That(darkRoastWithMocha.Cost(), Is.EqualTo(2.5));
        }
コード例 #3
0
        /// <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()}");
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: kantnisha/Patterns
        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();
        }
コード例 #5
0
        public void Cost_WithMocha_ReturnTwoDollarAndNineteenCents()
        {
            Beverage espresso = new Espresso();

            espresso = new Mocha(espresso);

            var cost = espresso.Cost();

            cost.Should().Be(2.19m);
        }
コード例 #6
0
        public void Cost_WithMocha_ReturnOneDollarAndTwentyFiveCents()
        {
            Beverage decaf = new Decaf();

            decaf = new Mocha(decaf);

            var cost = decaf.Cost();

            cost.Should().Be(1.25m);
        }
コード例 #7
0
        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());
        }
コード例 #9
0
ファイル: Program.cs プロジェクト: schangxiang/Code
        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());
        }
コード例 #10
0
        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();
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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());
        }