首页 > 代码库 > head first (三):装饰者模式

head first (三):装饰者模式

看到别人写的,都看不进去,算了还是自己手写一遍吧,算是帮助自己理解了。写的比较简单,例子也比较好懂,什么时候使用自己看着办。

1.定义

装饰者模式:动态地将职责附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。

装饰者和被装饰者对象都哟相同的超类。

装饰者会使程序中出现很多小类,增加使用难度

可以透明的插入装饰者,客户都不知道是和装饰者打交道

2:使用场景

对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展。

例如,现在需要一杯饮料,主体是水,可以选择添加甜味、咸等其他味道,这种情况下就可以使用装饰者模式。

3:代码实现

基类,抽象类

    public abstract class Drink    {        public string DrinkName = "";        //直接打印出名称        public void PrintName()        {            Console.WriteLine(DrinkName);        }        public abstract double Cost();    }

被装饰者,水。也可以是茶和其他的饮料

    public class Water : Drink    {        public Water()        {            DrinkName = "";        }        public override double Cost()        {            return 2;        }    }

装饰者,加糖,盐等

    /// <summary>    /// 甜味,每份2元,有点贵额    /// </summary>    public class Sweet:Drink    {        private Drink BaseDrink;        public Sweet(Drink drink)        {            BaseDrink = drink;            DrinkName = " 加糖"+BaseDrink.DrinkName;        }        public override double Cost()        {            return BaseDrink.Cost()+2;        }    }
    /// <summary>    /// 加盐    /// </summary>    public class Salt : Drink    {        private Drink BaseDrink;        public Salt(Drink drink)        {            BaseDrink = drink;            DrinkName = " 加盐"+BaseDrink.DrinkName ;        }        public override double Cost()        {            return BaseDrink.Cost() + 1;        }    }

老板来一份 加一份盐,2份甜味的水,这个味道重口味额

        static void Main(string[] args)        {            Drink OrderDrink = new Water();            OrderDrink = new Sweet(OrderDrink);            OrderDrink = new Sweet(OrderDrink);            OrderDrink = new Salt(OrderDrink);            OrderDrink.PrintName();            Console.WriteLine("您所需的价钱为:"+OrderDrink.Cost());            Console.ReadKey();        }

好了,饮料来了,付钱吧!骚年...