我是在HeadFirst上学到的装饰者模式,他是用Java编的,我改成了C#代码,代码如下:
using System;
using System.Collections.Generic;
using System.Text;namespace DesignModel
{
    class DecoratorPattern
    {
        public void TestDecorator()
        {
            Beverage be = new Espresso();
            be = new Mocha(be);
            be = new Mocha(be);
            be = new Whip(be);
            Console.WriteLine(be.getDescription()+" $"+be.cost());
        }
    }//****************************************************
    public abstract class Beverage
    {
       protected string description = "Unknown Beverage";        public string getDescription()
        {
            return description;
        }        public abstract double cost();
    }//++++++++++++++++++++++++++++++++++++++++++++++++++++    public abstract class CondimentDecorator : Beverage
    {
        public abstract string getDescription();
    }//*****************************************************    public class Espresso : Beverage
    {
        public Espresso()
        {
            description = "Espresso";
        }        public override double cost()
        {
            return 1.99;
        }
    }
    public class Mocha : CondimentDecorator
    {
        Beverage beverage;        public Mocha(Beverage beverage)
        {
            this.beverage = beverage;
        }        public override string getDescription()
        {
            return beverage.getDescription() + ", Mocha";
        }        public override double cost()
        {
            return beverage.cost() + 0.20;
        }
    }    public class Whip : CondimentDecorator
    {
        Beverage beverage;        public Whip(Beverage beverage)
        {
            this.beverage = beverage;
        }        public override string getDescription()
        {
            return beverage.getDescription() + ", Whip";
        }        public override double cost()
        {
            return beverage.cost() + 0.70;
        }
    }}
为啥输出的结果是Unknown Beverage
而不是:Espresso, Mocha, Mocha, Whip

解决方案 »

  1.   

     be = new Mocha(be);
     be = new Mocha(be);
     be = new Whip(be);
    ~~~~~~~~~~~~~~~~~~~~~~~
    这边确定没有写错?
      

  2.   


    你还是自己在好好把装饰者模式看看吧.装饰者的核心是,继承被装饰者类的框架并且添加被装饰者的引用,来增加操作.你建立Beverage 和CondimentDecorator的时候有点问题,粗略把你的程序修改了下.(测试通过)..
    using System;
    using System.Collections.Generic;
    using System.Text;namespace csdn_2009._4._0
    {
        class DecoratorPattern
        {
            public void TestDecorator()
            {
                Beverage be = new Espresso();
                be = new Mocha(be);
                be = new Mocha(be);
                be = new Whip(be);
                Console.WriteLine(be.getDescription() + " $" + be.cost());
            }
            static void Main(string[] args)
            {
                DecoratorPattern dp = new DecoratorPattern();
                dp.TestDecorator();
                Console.ReadLine();
            }
        }    //****************************************************
        public abstract class Beverage
        {
            protected string description = "Unknown Beverage";        public abstract string getDescription();
            //{
            //    return description;
            //}        public abstract double cost();
        }    //++++++++++++++++++++++++++++++++++++++++++++++++++++    public abstract class CondimentDecorator : Beverage
        {
            protected Beverage _beverage ;
            //public abstract string getDescription();
        }    //*****************************************************    public class Espresso : CondimentDecorator //Beverage
        {
            public Espresso()
            {
                description = "Espresso";
            }
            public Espresso(Beverage b)
            {
                this._beverage = b;
            }
            public override string  getDescription()
            {
                if (_beverage != null)
                    return _beverage.getDescription() + this.description;
                else
                    return this.description;
            }        public override double cost()
            {
                if (_beverage != null)
                    return _beverage.cost() + 1.99;
                else
                    return 1.99;
            }
        }
        public class Mocha : CondimentDecorator
        {
            //Beverage beverage;        public Mocha(Beverage beverage)
            {
                this._beverage = beverage;
            }        public override string getDescription()
            {
                if (_beverage != null)
                    return _beverage.getDescription() + ", Mocha";
                else
                    return "Mocha";
            }        public override double cost()
            {
                if (_beverage != null)                return _beverage.cost() + 0.20;
                else
                    return 0.20;
            }
        }    public class Whip : CondimentDecorator
        {
            //Beverage beverage;        public Whip(Beverage beverage)
            {
                this._beverage = beverage;
            }        public override string getDescription()
            {
                if (_beverage != null)
                    return _beverage.getDescription() + ", Whip";
                else
                    return "Whip";
            }        public override double cost()
            {
                if (_beverage != null)
                    return _beverage.cost() + 0.70;
                else
                    return 0.70;
            }
        }
    }
      

  3.   

    整理了下,希望能对你有帮助.个人认为如下写比较规范清晰明了.
    using System;
    using System.Collections.Generic;
    using System.Text;namespace _009._4._0
    {
        class Program
        {
            static void Main(string[] args)
            {
                Espresso espresso = new Espresso();
                CondimentDecorator decorator1 = new MochaDecorator(espresso);
                CondimentDecorator decorator2 = new MochaDecorator(decorator1);
                CondimentDecorator decorator3 = new WhipDecorator(decorator2);
                CondimentDecorator decorator4 = new EspressoDecorator(decorator3);
                Console.WriteLine(decorator4.getDescription() + "\tCost :" + decorator4.cost());
                Console.ReadLine();
            }
        }
        public abstract class Beverage
        {
            protected string description = "Unknown Beverage";        public abstract string getDescription();
           
            public abstract double cost();
        }    public abstract class CondimentDecorator : Beverage
        {
            protected Beverage _beverage;       
        }    public class Espresso : Beverage
        {
            public Espresso()
            {
                description = "Espresso";
            }        
            public override string getDescription()
            {            
                    return this.description;
            }        public override double cost()
            {            
                    return 1.99;
            }
        }
        public class Mocha : Beverage
        {
            public Mocha()
            {
                description = "Mocha";
            }
            public override string getDescription()
            {
                return this.description;
            }        public override double cost()
            {
                return 0.20;
            }
        }
        public class Whip : Beverage
        {
            public Whip()
            {
                description = "Whip";
            }
            public override string getDescription()
            {
                return this.description;
            }        public override double cost()
            {
                return 0.70;
            }
        }    public class MochaDecorator : CondimentDecorator
        {
           
            public MochaDecorator(Beverage beverage)
            {
                this._beverage = beverage;
            }        public override string getDescription()
            {            
                    return _beverage.getDescription() + ", Mocha";
                
            }        public override double cost()
            {           
                    return _beverage.cost() + 0.20;
              
            }
        }
        public class WhipDecorator : CondimentDecorator
        {
            
            public WhipDecorator(Beverage beverage)
            {
                this._beverage = beverage;
            }        public override string getDescription()
            {
                return _beverage.getDescription() + ", Whip";        }        public override double cost()
            {
                return _beverage.cost() + 0.70;        }
        }
        public class EspressoDecorator : CondimentDecorator
        {
            public EspressoDecorator(Beverage beverage)
            {
                this._beverage = beverage;
            }        public override string getDescription()
            {
                return _beverage.getDescription() + ", Espresso";        }        public override double cost()
            {
                return _beverage.cost() + 1.99;        }
        }}