zoukankan      html  css  js  c++  java
  • 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();
            }

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

  • 相关阅读:
    Windows下使用Nginx+tomcat配置负载均衡
    Windows系统搭建Mysql Cluster集群
    java.math.BigDecimal cannot be cast to java.lang.String解决方法
    Java从后台重定向(redirect)到另一个项目的方法
    Java代码中获取配置文件(config.properties)中内容的两种方法
    mybatis和redis整合 log4j打印sql语句
    Windows系统安装测试redis
    myeclipse 2014新建maven web 项目步骤
    myeclipse用maven搭建web项目后tomcat启动报找不到jar包解决办法
    《剑指offer》丑数
  • 原文地址:https://www.cnblogs.com/xiaoshuai1992/p/headfirst3.html
Copyright © 2011-2022 走看看