奇门遁甲游四方,九星八门断吉凶;|

青衫磊落长歌行

园龄:4年2个月粉丝:2关注:1

2022-11-10 10:05阅读: 11评论: 0推荐: 0

结构型模式 - 装饰器模式Decorator

1.你这老母亲的,我哪来的广告?

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

装饰器模式的定义与特点

        装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。  

装饰器模式优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

装饰器模式的缺点是:

  • 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。  

装饰器模式的结构与实现

        通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。下面来分析其基本结构和实现方法。

1. 模式的结构

装饰器模式主要包含以下角色。

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰器模式的结构图如图 1 所示。

图1

using DesignPattern.DecoratorPattern;
using System;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DecoratorHelper();
        }

        #region Pattern - Decorator
        static void DecoratorHelper()
        {
            DrinkDecorator _syrup = new Syrup();
            DrinkDecorator _coffee = new Coffee();
            DrinkDecorator _sodaWater = new SodaWater();
            
            _syrup = new Ice(_syrup);
            _coffee = new Sugar(_coffee);

            _sodaWater = new Mint(_sodaWater);
            _sodaWater = new Ice(_sodaWater);
            
            Console.WriteLine($"{_syrup.Des} {_syrup.Cost}");
            Console.WriteLine($"{_coffee.Des} {_coffee.Cost}");
            Console.WriteLine($"{_sodaWater.Des} {_sodaWater.Cost}");
            
            Console.ReadLine();
        }
        #endregion
    }
}

//======================================================================================

namespace DesignPattern.DecoratorPattern
{
    /// <summary>
    /// 抽象饮品装饰者类
    /// </summary>
    public abstract class DrinkDecorator
    {
        /// <summary>
        /// 名字
        /// </summary>
        protected string Name { get; set; }

        /// <summary>
        /// 售价
        /// </summary>
        protected int Price { get; set; }

        /// <summary>
        /// 介绍:名字
        /// </summary>
        public abstract string Des { get; }

        /// <summary>
        /// 售价
        /// </summary>
        public abstract int Cost { get; }
    }

    /// <summary>
    /// 汽水
    /// </summary>
    public class SodaWater : DrinkDecorator
    {
        public SodaWater()
        {
            Name = "汽水";
            Price = 8;
        }

        public override string Des => this.Name;
        public override int Cost => this.Price;
    }

    /// <summary>
    /// 咖啡
    /// </summary>
    public class Coffee : DrinkDecorator
    {
        public Coffee()
        {
            Name = "咖啡";
            Price = 15;
        }

        public override string Des => this.Name;
        public override int Cost => this.Price;
    }

    /// <summary>
    /// 果汁
    /// </summary>
    public class Syrup: DrinkDecorator
    {
        public Syrup()
        {
            Name = "果汁";
            Price = 12;
        }

        public override string Des => this.Name;
        public override int Cost => this.Price;
    }

    /// <summary>
    /// 配料
    /// </summary>
    public abstract class Batching : DrinkDecorator
    {
        protected readonly DrinkDecorator m_drink;
        public Batching(DrinkDecorator drink)
        {
            m_drink = drink;
        }
        public override string Des => $"{m_drink.Des} + {this.Name}";
        public override int Cost => m_drink.Cost + Price;
    }
    public class Sugar : Batching
    {
        public Sugar(DrinkDecorator drink) : base(drink)
        {
            Name = "糖";
            Price = 2;
        }
    }
    public class Ice : Batching
    {
        public Ice(DrinkDecorator drink) : base(drink)
        {
            Name = "冰块";
            Price = 1;
        }
    }

    public class Mint : Batching
    {
        public Mint(DrinkDecorator drink) : base(drink)
        {
            Name = "薄荷";
            Price = 3;
        }
    }
}

希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

        今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

posted @   青衫磊落长歌行  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起