设计模式(3)-装饰者模式

实验六 存储器实验 只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。当地址为00000101时,会分别在数据位宽为8,16,32的只读寄存器中找到地址为00000101所对应的十进制地址位置,也就是地址为5的数据,并将其分别以8位,16位,32位输出。因此,输出保持为0。因此,当异步清零信号为1时,无论其他输入信号是什么,触发器的输出都会被强制清零,输出为0。1)寄存器输入0011,使能端1,异步清零0。 阅读详情


更多关于设计模式的文章请点击:设计模式之禅(0)-目录页


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

一、装饰者模式的特点

1、 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
2、 装饰对象包含一个真实对象的引用(reference。
3、 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
4、 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

二、装饰者模式的使用情景

1、 需要扩展一个类的功能,或给一个类添加附加职责。
2、需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3、要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4、 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

三、装饰者模式的一般关系图

在这里插入图片描述

在这里插入图片描述

四、装饰者模式的代码实现

在这里插入图片描述

  • Animal超类
/**
 * @Description:    Animal超类
 * @CreateDate: Created in 2018/11/25 11:03
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public abstract class Animal {
    private String description;

    public abstract String getDescription();


    public void setDescription(String description) {
        this.description = description;
    }
}
  • Dog子类
/**
 * @Description: Dog extends Animal
 * @CreateDate: Created in 2018/11/25 11:09
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class Dog extends Animal {

    @Override
    public String getDescription() {
        setDescription("dog");
        return "dog";
    }
}
  • Bigger -Animal的包装类
/**
 * @Description: Bigger是一个装饰者
 * @CreateDate: Created in 2018/11/25 11:12
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class Bigger extends Animal{
    private Animal animal;

    public Bigger(Animal animal){
        this.animal = animal;
    }
    @Override
    public String getDescription() {
        return animal.getDescription()+"Bigger";
    }
}
  • 使用Bigger包装类去包装Dog子类
/**
 * @Description: 测试装饰者模式
 * @CreateDate: Created in 2018/11/25 11:21
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class TestDecoratorPattern {

    @Test
    public void BiggerDecorateDog(){
        Animal dog = new Dog();
        //使用装饰者装饰前
        String wrapBefore = dog.getDescription();
        System.out.println("使用装饰者装饰前"+wrapBefore);
        //创建装饰者Bigger用以包装Dog
        Animal biggerDog = new Bigger(dog);
        //使用装饰者装饰后
        String wrapAfter = biggerDog.getDescription();
        System.out.println("使用装饰者装饰后"+wrapAfter);
    }
}

在这里插入图片描述

五、装饰者模式使用的设计原则

1、多组合,少继承
每一个装饰者都需要组合一个Animal,这样才能在包装时得到原先被装饰者的属性和方法等,支持在构造方法中动态地扩展。

2、类应设计的对扩展开放,对修改关闭。

六、I/O流-典型的装饰者模式

Java标准库中的I/O流库是使用装饰者模式实现的:
在这里插入图片描述
它们的方法和属性继承自超类InputStream,所以,它们在使用方面几乎大同小异,但是会有少许的增强方法。

在这里插入图片描述

七、装饰者模式的弊端

  1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
SAP 实例解析分期付款配置及应用 SAP系统的付款条件支持分期付款功能,其奥妙之处就在于需要定义一个母条款和一个子条款,其中,母条款需要标识“分期付款”。 首先,定义分期付款的母条款OBB8:             然后,定义子条款(即分期付款的具体方式)OBB9:   由上图可以看出,分期付款的配置还是很强大的,针对每次付款,都可以进行第二层次付款条件的设置。   然后,我们做一笔发票, 阅读详情

相关推荐

Mind+掌控板实战:5分钟搞定Easy IoT的MQTT通讯(附完整代码)

本文详细介绍了如何利用掌控板和Mind+图形化编程软件,快速实现基于Easy IoT平台的MQTT通讯。通过清晰的步骤讲解和完整的代码示例,指导用户完成从云端配置、Wi-Fi连接到MQTT消息发布与订阅的全过程,帮助初学者轻松构建物联网设备间的双向对话系统。

weixin_29300241的博客 451

设计模式第7讲——装饰者模式(Decorator)

装饰者模式是一种结构型设计模式。一、什么是装饰者模式 二、角色组成 三、优缺点 四、应用场景 4.1 应用实例 4.2 java实例 五、代码实现5.0 UML类图5.1 Hero(英雄-抽象组件)5.2 BlindMonk(盲僧-具体构件)5.3 SkillDecorator(技能装饰-抽象装饰器)5.4 QDecorator(Q技能-具体装饰器)5.5 WDecorator(W技能-具体装饰器)5.6 EDecorator(E技能-具体装饰器)5.7

让~学习~成为一种习惯(橡 皮 人の技术博客) 6798

甲基化生物信息学分析及批次效应校正全流程

本文系统阐述了DNA甲基化数据分析中的批次效应问题及解决方案。甲基化数据(β值和M值)对实验批次差异高度敏感,可能导致假阳性结果。文章详细介绍了批次效应检测方法(PCA可视化、BEclear定量评分)和校正流程,包括数据预处理、参数化(ComBat-met)与非参数化(BEclear)校正方法,并提供了完整的R代码实现。重点解决了β值有界分布与统计模型假设冲突的问题,为甲基化研究的可靠性提供技术保障。

huanghm88的专栏 111

设计模式~~~装饰者模式

学习难度:※※※ 使用频率:※※※ 上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式。 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。 一

PeakGao 1906

ESD防护设计宝典(二十三):ESD与EOS失效差异分析

ESD和EOS是电子制造业面临的两大挑战,随着电子产品向更高集成度、更低工作电压和更高工作频率发展,这一问题将更加突出。根据美国军方上世纪八十年代与可靠性分析中心(RAC)共同建立的现场失效返回程序(FFRP)统计数据,产品现场返回中EOS占比高达46%,而ESD仅占6%,另有6%的案例难以区分是EOS还是ESD。

m0_56451176的博客 322

SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)

SAP公司间STO业务解析

ww114784的博客 1021

设计模式(三)—— 装饰者模式

由于之前看的容易忘记,因此特记录下来,以便学习总结与更好理解,该系列博文也是第一次记录,所有有好多不完善之处请见谅与留言指出,如果有幸大家看到该博文,希望报以参考目的看浏览,如有错误之处,谢谢大家指出与留言。 一、咖啡馆订单系统项目 咖啡馆订单系统项目: 咖啡馆订单项目: 1)、咖啡种类:Espresso、ShortBlack(浓缩)、LongBlack、Decaf (无糖)(这些就...

平凡之路无尽路的博客 2万+

基于STM32、HAL库的IP5356M_DBZ_CA快充协议芯片简介及驱动程序设计

IP5356M_BATTERY_LEVEL_25 = 1, /* 电池电量25% */IP5356M_CHARGE_STATE_CHARGE_DONE = 4, /* 充电完成 */IP5356M_CHARGE_STATE_FAST = 2, /* 快速充电 */IP5356M_CHARGE_STATE_NONE = 0, /* 无充电 */IP5356M_CHARGE_STATE_PRE = 1, /* 预充电 *//* 延时1秒 */

corlin6688的博客 1419

设计模式之装饰者模式

一.装饰者模式特点:1.装饰者和被装饰者对象有相同的超类2.可以用一个或多个装饰者包装一个对象3.由于装饰者和被装饰者具有相同超类,所以任何需要被包装对象的场合,可以用装饰过的对象代替4.装饰者可以再所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的(重点)5.对象可以在任何时候被装饰,所以可以在运行时动态的不限量的用你喜欢的装饰者来装饰对象二.装饰者模式定义: 动态地将责任附加到...

xipengbozai的博客 121

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5336

设计模式-装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它是继承的一种替代方案,可以实现在运行时动态地扩展对象的行为,而无需修改原有代码。

m0_51176516的博客 2110

RT-DETR-R18 的轻量化 Trick:剪枝与量化在模型中的应用

RT-DETR-R18轻量化技术通过结构化剪枝、混合精度量化和知识蒸馏的组合优化,实现了显著模型压缩效果。摘要如下: RT-DETR-R18模型通过创新轻量化技术组合,在保持46.2% mAP精度的前提下,将模型大小压缩至2.1MB(压缩率78%),计算量降至3.2 GFLOPs(减少78.2%),实现移动端28ms实时推理(加速37.8%)。核心技术包括:1)渐进式结构化剪枝系统,通过L1范数重要性评估和动态剪枝调度;2)混合精度量化策略,对关键层保留FP16精度;3)教师-学生知识蒸馏框架保持模型表达能

走向CTO的路上... 1193

浅析设计模式3 —— 装饰者模式

推荐语:本文从装饰者模式的核心思想到与其他设计模式的横向对比,从代码示例到业务实战,向读者娓娓呈现装饰者模式的真貌。深入浅出的JDK源码透析,使用场景的利弊权衡,真的值得一阅!——大淘宝技术开发工程师 玄苏装饰者模式的核心思想是通过创建一个装饰对象(即装饰者),动态扩展目标对象的功能,并且不会改变目标对象的结构,提供了一种比继承更灵活的替代方案。本文为此系列第三篇文章。第一篇:浅析设计模式1——...

淘系技术 1993

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HeadFirst 设计模式学习笔记3--装饰模式

本文已搬家至【HeadFirst 设计模式学习笔记】3 装饰模式

gnuhpc的专栏 3431

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《设计模式》之 3 装饰者模式

注意:本文内容大部分参考自文章设计模式详解——装饰者模式_简书 1 装饰者模式介绍 意图:向一个现有的对象添加新的功能,同时又不改变其结构。 装饰者模式的类图如下: 在装饰模式中的角色有: 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。 装饰(Decorator)角色:持有...

张之海的博客 335

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【设计模式总结】3、装饰者模式

装饰者模式是个非常著名的模式,学过Python的应该知道有个东西叫装饰器,与装饰者模式的概念类似。有关Python装饰器请点击。 那么装饰者模式到底有什么用,下面给出装饰者模式的概念: 动态地将责任附加到对象上。扩展想要的功能,装饰者提供有别于继承的另一种选择。 总结一句话就是,装饰者模式用于动态扩展功能。 下面是装饰者模式类图 注:Decorator也可以用接口,装饰者模式的Component...

Alexander的博客 172

设计模式 - D3 - 装饰者模式

设计模式 - D3 - 装饰者模式装饰者模式开闭原则定义特点实现优缺点 装饰者模式 编写程序时,利用继承设计子类的行为是在编译时静态决定的,且所有子类都会继承到相同的行为;相反,利用组合的做法扩展对象的行为,可以在运行时动态地扩展,在使用新代码添加新功能的同时,无须修改现有代码,进而减少产生bug的机会 假设现在有一个超类Beverage,其中的属性代表了各式调料,cost()方法会计算所有调料的价钱;为了提供各式各样的饮料,每个子类都需要继承超类Beverage,并重写cost()方法,扩展超类的功能,计

LeonAPASS的博客 295

设计模式3-装饰者模式

1.场景问题解决 咖啡厅组合咖啡本体和配料. 1.1 场景描述 咖啡单品----:Decaf(无咖啡因),Espresso(浓咖啡),LongBlack(深黑咖啡),ShortBlack(浅黑),价格各不同 咖啡调料----:Milk(牛奶),mocha(摩卡),chocolate(巧克力),价格各不同 以上单品为一份,然后调料可以自由组合,最终计算出咖啡的金额 1.2 OO设计 继承–&g...

bobshute的专栏 218

设计模式3——装饰者模式

定义:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加弹性的解决方案。 1 引例_咖啡订单系统 1.1 最初设计。 如图1,首先创建一个Bevarage(饮料)的抽象类,店内所有的咖啡都继承这个类。description是成员变量,由子类设置,描述咖啡使用。getDescription()就是返回这个描述。cost()方法是抽象方法,由子类实现,计算价格使用。 最开始咖啡就有如...

可耳(keer)的博客 200

Java设计模式3:装饰者模式

一.装饰者模式 1.介绍: 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。2.参与者: ◆抽象组件(Component): 所有组件和装饰者的超类,装饰者和被装饰(组件)对象要有相同的超类型 ◆具体组件(ConcreteComponent): ConcreteComponent是我们将要动态地加上新行为 (装饰者) 的对象,它扩展自Compone............

Tiglle的博客 747

《head first 设计模式》——3、装饰者模式

装饰者模式——星巴兹咖啡为例

weixin_45826787的博客 207

设计模式3——(装饰模式)

3、装饰模式 3.1、概念 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 3.2、特点 (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 (4) 装饰对象可以在转发这

qq_43605227的博客 198

《HF 设计模式》 C3 装饰者模式

文章目录1 模拟咖啡厅菜单1.1 粗糙地使用继承1.2 细致一些地使用继承1.3 再谈继承和组合1.4 开放-关闭原则1.5 认识装饰者模式1.6 重新设计咖啡菜单 1 模拟咖啡厅菜单 现在我们去尝试模拟咖啡厅的菜单,比如顾客需要一杯拿铁,那我们就给他一杯拿铁,并计算出价格 但是如果顾客需要加入一些调料,如摩卡,奶泡,蒸奶等,问题就变得复杂起来,调料有很多种,每种调料都有其价格,顾客可以选择1种或多种,这让我们获得一个加了调料的拿铁对象变得复杂起来,而且如果需要双倍的奶泡呢?如果还需要引入大中小杯呢?

weixin_43541094的博客 484

设计模式(3)——装饰者模式

装饰者(Decorator)模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方法。 装饰者和被装饰对象有相同的超类型。 你可以用一个或多个装饰者包装一个对象。 既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。 装饰者可以在所委托被装饰者的行为前后,加上自己的行为,以达到特定的目的。 对象可以在任何时候...

liinux-Talk is cheap,show me the code. 177

设计模式 3-装饰模式

设计模式 3-装饰模式 装饰模式有几个元素很重要,1、被装饰者。2、抽象装饰者。3、装饰者对象 具体装饰者对象

qq_18846731的博客 125
上一篇: 设计模式(2)-观察者模式
下一篇: 设计模式(4)-工厂模式
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值