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

今日推荐

结构型模式 - 装饰器模式Decorator的更多相关文章

  1. 《精通Python设计模式》学习结构型之装饰器模式

    这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...

  2. Decorator模式 装饰器模式

    Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加 ...

  3. Python3-设计模式-装饰器模式

    装饰器模式 动态的给原有对象添加一些额外的职责,面向切面编程(AOP),多用于和主业务无关,但又必须的业务,如:登录认证.加锁.权限检查等 Python代码实现示例 需求点: 1.在old_func( ...

  4. 装饰器模式(Decorator Pattern)

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

  5. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  6. c#设计模式之装饰器模式(Decorator Pattern)

    引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...

  7. Java IO流以及装饰器模式在其上的运用

    流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...

  8. python设计模式之装饰器模式

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

  9. java设计模式之 装饰器模式

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

  10. JAVA设计模式--装饰器模式

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

随机推荐

  1. RDF/RDFS/OWL

    RDF(Resource Description Framework 资源描述框架) 知识总是以三元组形式出现: (subject, predicate, object) 即 (主,谓,宾) 资源和属 ...

  2. curl 下载地址中有特殊字符解决方案

    curl 下载地址中有特殊字符解决方案 情况 使用 curl 下载 地址中带有 特殊字符的时候 比如下面这个地址.实际访问地址不正确,参数丢失问题 curl -o kspf.jpeg https:// ...

  3. mysql是如何实现mvcc的

    mvcc的概念 mvcc即多版本并发控制,是一种并发控制的策略,能让数据库在高并发下做到安全高效的读写,提升数据库的并发性能; 是一种用来解决并发下读写冲突的无锁解决方案,为事务分配单向增长时间戳,为 ...

  4. 2022春每日一题:Day 31

    题目:机器分配 设f[i][j]表示前i个机器,共分配了j个的最大值,枚举第i个机器分配个数,转移f[i][j]=max{f[i-1][k]+a[i][j-k]},此题只是加了个要输出 代码: #in ...

  5. Kubernetes介绍和资源管理

    Kubernetes介绍和资源管理 Kubernetes介绍 官网:https://kubernetes.io/ 一.应用部署方式演变 1.传统部署:互联网早期,会直接将应用程序部署在物理机上 优点: ...

  6. Ubuntu 20.04 开启root权限登陆、网卡配置

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Ubuntu 20.04 开启root权限登陆.网 ...

  7. lightdm开机无法自启问题

    简述 由于我学习了 systemctl disable 服务 这条命令,然后开始皮,把 lightdm 自启动关了,然后开不开了 解决办法:重置 lightdm 服务配置 sudo dpkg-reco ...

  8. 长度最小子数组-LeetCode209 滑动窗口

    力扣:https://leetcode.cn/problems/minimum-size-subarray-sum/ 题目 给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满 ...

  9. filter: hue-rotate() 制作炫酷的文字效果

    主要用到属性有: filter 滤镜的 hue-rotate 色调旋转, text-shadow 文字阴影, transform 的 scale缩放, transition 过渡属性, animati ...

  10. 秒级查询之开源分布式SQL查询引擎Presto实操-上

    @ 目录 概述 定义 概念 架构 优缺点 连接器 部署 集群安装 常用配置说明 资源管理安装模式 安装命令行界面 基于Tableau Web 连接器 使用优化 数据存储 查询SQL优化 无缝替换Hiv ...