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();
        }

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

posted @ 2014-08-07 21:55  清风君  阅读(363)  评论(0编辑  收藏  举报