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之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们

今日推荐

最新文章

  1. FB
  2. iOS--归档和解档(Archiver)、(UnArchiver)
  3. 1109关于redo_Log和undo_log和BIN-LOG
  4. 反向Ajax,实现服务器向客户端推送消息
  5. tomcat发布记录
  6. Linux下解压命令
  7. PHP页面跳转几种实现技巧
  8. 【转】HashMap的工作原理
  9. qsort函数、sort函数 (精心整理篇)
  10. Sql Server内置函数实现MD5加密
  11. ifame高度自动适应子页面内容
  12. 浅谈 JSON.stringify 方法
  13. App架构师实践指南三之基础组件
  14. 1.8.2suspend与resume方法的缺点-独占
  15. 《Node.js 包教不包会》
  16. vagrant 安装与配置
  17. oracle中connect by语句的优化
  18. OpenCV中的按钮问题
  19. Python中单例模式的使用方法
  20. C++之结构体struct

热门文章

  1. Python--网络编程学习笔记系列02 附:tcp服务端,tcp客户端
  2. 记录第一次在Linux环境编译第三方C++库
  3. linux重置密码
  4. Nginx 使用自签名证书实现 https 反代 Spring Boot 中碰到的页面跳转问题
  5. .NET周报【11月第1期 2022-11-07】
  6. srcddd
  7. 【OpenStack云平台】Packmaker 集群
  8. 【OpenStack云平台】SecureCRT 连接 CentOS虚拟机
  9. 视觉享受,兼顾人文观感和几何特征的字体「GitHub 热点速览 v.22.46」
  10. 关于python实现html转word(docx)