装饰器模式组成:

  1. 抽象组件角色(Component): 定义可以动态添加任务的对象的接口
  2. 具体组件角色(ConcreteComponent):定义一个要被装饰器装饰的对象,即 Component 的具体实现
  3. 抽象装饰器(Decorator): 维护对组件对象和其子类组件的引用
  4. 具体装饰器角色(ConcreteDecorator):向组件添加新的职责

一.装饰者模式的定义:

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

举一个例子:假如我们去奶茶店买奶茶,有两个品种蜂蜜奶茶和珍珠奶茶。这两种奶茶分别可以加糖,加牛奶,加冰等等 加不同的料收费不同,如果我们想要用程序输出他们的价格和名字如何做呢?首先想到的就是把他们公共的部分抽象成一个接口,不管是什么奶茶都有价格,名称于是我们可以把这一部分抽象成接口。然后用去实现这个接口,那么会有蜂蜜奶茶类,蜂蜜奶茶加糖,蜂蜜奶茶加牛奶等等的类。这还仅仅只是加一种料哦,如果可以需要加糖又加牛奶那么又需要一个类,这样设计的话我们的子类会非常的繁多。所以应对这种情景的设计模式就出现了。贴上代码

 #region component构建接口(抽象构建) ,奶茶接口,提供奶茶名称以及奶茶价格方法public interface IMilkTea{void MilkTeaName();int MilkPrice();}#endregion#region ConcreteComponent 具体构建(主体类)也就是需要拓展的对象public class HoneyTea : IMilkTea{public int MilkPrice(){return 20;}public void MilkTeaName(){Console.Write("蜂蜜奶茶");}}public class PeralTea : IMilkTea{public int MilkPrice(){return 15;}public void MilkTeaName(){Console.Write("珍珠奶茶");}}#endregion#region Decorator类public class TeaDecorator : IMilkTea{protected IMilkTea milkTea;public TeaDecorator(IMilkTea milkTea){this.milkTea = milkTea;}public int MilkPrice(){int normalPrice = milkTea.MilkPrice();int addPrice = this.AddPrice();return normalPrice + addPrice;}public void MilkTeaName(){milkTea.MilkTeaName();this.AddName();}public virtual void AddName(){}public virtual int AddPrice(){return 0;}}#endregion#region ConcreteDecorator具体装饰类public class AddCoffeeDecorator : TeaDecorator{public AddCoffeeDecorator(IMilkTea milkTea) : base(milkTea){}public override void AddName(){Console.Write("添加了咖啡");}public override int AddPrice(){return 15;}}public class AddIceDecorator : TeaDecorator{public AddIceDecorator(IMilkTea milkTea) : base(milkTea){}public override void AddName(){Console.Write("添加了冰块");}public override int AddPrice(){return 5;}}#endregion

TeaDecorator 装饰器类,它里面有抽象接口的引用,当运行起来的时候它实际上就是表示具体被装饰对象。该设计模式主要用来拓展对象的功能。来看看它如何被调用

            //Decorator装饰模式//需要扩展一个类的功能,或给一个类增加附加功能。//需要动态的给一个对象增加功能时(可随时撤销)。//例如下面一个例子:假如不止是蜂蜜奶茶和珍珠奶茶//假如不止是加咖啡和冰块,假设6种名称的奶茶和10种口味的//将他们设计成类的话至少有6*10个类(不包括组合的,一种奶茶加很多口味的情况)IMilkTea honeyTea = new HoneyTea();honeyTea.MilkTeaName();Console.WriteLine("价格是:" + honeyTea.MilkPrice());honeyTea = new AddCoffeeDecorator(honeyTea);honeyTea.MilkTeaName();Console.WriteLine("价格是:" + honeyTea.MilkPrice());honeyTea = new AddIceDecorator(honeyTea);honeyTea.MilkTeaName();Console.WriteLine("价格是:" + honeyTea.MilkPrice());

输出如下:

设计模式:装饰器模式相关推荐

  1. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  2. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  3. Spring设计模式(装饰器模式)

    Spring设计模式(装饰器模式) 模式的定义: 装饰者模式定义: ​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 模式的结构图 : 模式包含角 ...

  4. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

  5. 设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.简单来说,装饰器模式就是 ...

  6. PHP设计模式——装饰器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装 ...

  7. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  8. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  9. C++设计模式 装饰器模式

    文章目录 1. 先验知识 2. 装饰器模式相关概念 3. 装饰器模式的应用 3.1 应用1: 给形状添加新的特征 不同形状加红 3.2 应用2: 给一个人穿不同的衣服 a 直接person类, 增加穿 ...

  10. 白话设计模式-装饰器模式的使用和意义

    装饰器模式展示 在学习设计模式的过程中,将自己对于设计模式的理解,以最简单,最白话的方式,分享给大家.个人觉得,对于设计模式的理解,需要将他从最抽象的理论里,真实的代入到实际的业务场景中,将会有最深刻 ...

最新文章

  1. 进程间通信 IPC 的本地过程调用 LPC(Local Procedure Call)和远程过程调用 RPC(Remote Procedure Call)
  2. PHP 入门 - 9.安全
  3. Android与Libgdx环境配置
  4. 如何解开机器学习的面纱?
  5. Linux之GDB调试命令
  6. python多人游戏服务器_Python在线多人游戏开发教程
  7. 我的世界修改服务器标识,我的世界修改服务器图标小技巧分享
  8. 解决在微信下载app需要点击右上角在浏览器中打开下载的问题
  9. 使用标尺工具获取某点的坐标
  10. win10亮度_安利一款PC端调节多显示器亮度的软件
  11. matlab 脉冲压缩算法,雷达脉冲压缩matlab
  12. 软件项目中得风险应对策略
  13. 北京二手房呈井喷态势 单日网签年内首超600套
  14. OSPF—DR与BDR知识点及选举
  15. 仿热血江湖帮战客方.申请人物列表
  16. 技术真好玩第一期(2019-11-01)
  17. 18938 汉诺塔问题
  18. 手写签名更改为透明背景png图片
  19. 计算机网络笔记(油管FreeCodeCamp)Computer Networking
  20. splash占用内存越来越大的问题

热门文章

  1. 一分钟解决Zoom无法连接的问题
  2. 使用java图形界面实现简单的数据库增删查改
  3. Android 12 关机重启流程
  4. 我造了一件钢铁侠战衣,防弹抗爆,能!上!天!
  5. 代谢组学研究病毒传染性疾病的文献推荐
  6. C# 8.0和.NET Core 3.0高级编程 分享笔记三:控制流程和转换类型
  7. 微信第三方平台推送verify_ticket的接收处理(PHP实现)
  8. Fidder微信小程序抓包抓不上 fidder微信小程序抓包入门保姆教程
  9. 使用JS实现表格宽度任意竖轴滚动时表头固定
  10. 三国志战略版:Daniel_S4蜀骑推荐