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

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

  • 相关阅读:
    shell脚本修改Linux系统中所有IP样例
    关闭并卸载数据库脚本
    查询编译不通过的存储过程并重新编译
    SQL函数造数据样例(一)
    类型转换和多态
    Java学习笔记(三)
    Java学习笔记二()
    Java学习笔记(一)
    1.2.零宽断言
    1.3.匹配小括号的字符(可能有小括号在一行的,也有多行的)
  • 原文地址:https://www.cnblogs.com/xiaoshuai1992/p/headfirst3.html
Copyright © 2020-2023  润新知