设计模式 - 装饰模式

设计模式——装饰模式 装饰模式是一种用来替代继承的思想,它使用对象之间的关联关系来取代类之间的继承关系。继承是一种常用的一种拓展原有类的功能的方法,通过创建一个继承父类的子类来拓展原有的功能,在“合成复用原则”中曾提到,在处理类的功能拓展这个问题上应尽量使用类之间的关联关系而少使用继承关系。为什么要用这个模式:以对客户透明的方式动态地给一个对象附加上更多的责任,装饰模式可以在不需要创造更多的子类的情况下,将对象的功能加... 阅读详情

目录

引言

示例

代码

总结


引言

装饰模式。

顾名思义,装饰是什么?就是对某个东西进行修饰,从而使得某个东西具有更多的特性。

对应在java中,装饰的东西常常是一个类,对其进行装饰的目的是为了让它具有更多的属性和方法。然而实现这个目的却需要一种合理的方式。一般的思路是什么呢?

假设有一个接口Plant,该接口有一个实现类Tree。普通的树结的果子就是果子,但是有可能有些树结的果子是金子(。。。),比如摇钱树。实现树结出金子的方案有以下3种:

1、修改实现类Tree的方法。直接修改方法,突出一个不是树木共性的特性,这样不是很好;

2、再增加一个实现类,实现摇钱树。这样的话如果我想生成具有更多特性的树,岂不是需要生成很多实现类?

3、装饰模式,使用一个抽象类横向地扩展想要修饰的类(称为目标类)。这样不会影响目的类继承链上的其他类,例如:C extends B , B extends A,如果需要扩展B的功能,可以设计一个B的装饰类,它并不会影响B的子类C。如果采用在B里面增加方法,势必会使B的所有子类结构被改变。。


示例

装饰模式的一般步骤:

  • 定义一个接口Plant;
  • 定义一个装饰目标类Tree,实现接口Plant;
  • 定义一个用来装饰的横向扩展类(抽象类)TreeDecorator,内部持有目标类Tree的引用;
  • 定义一个横向扩展类的实现类TreeDecorator ,增强目标类想要增强的方法bearFruit();
  • 最后,客户端可以通过调用横向扩展类的实现类,来实现对Tree结出金子的方法,并且保证了不会影响Tree类的继承链上的其他类。

代码

接口:

public interface Plant {
    
    // 定义一个结果的方法
    String bearFruit();
}

实现类Tree(目标类):

public class Tree implements Plant {

    // 针对这个方法,想对他进行加强
    @Override
    public String bearFruit() {
        return "树结果子";
    }
}

横向扩展的抽象类(装饰类):

public class AbstractDecorator implements Plant {
    // 持有目标类的引用
    private Plant plant;

    // 构造函数注入目标类
    // 注:模块间的依赖通过抽象的接口(Plant)产生,而不是通过实现类(Tree),符合依赖倒置原则
    public AbstractDecorator (Plant plant) {
        this.plant = plant;
    }

    // 调用目标类的方法
    @Override
    public String bearFruit(){
        return plant.bearFruit();
    }
}

值得注意的是:模块间的依赖通过抽象的接口(Plant)产生,而不是通过实现类(Tree),符合依赖倒置原则

装饰类的实现类:

public class TreeDecorator extends AbstractDecorator {

    public TreeDecorator(Plant plant) {
        super(plant);
    }

    //装饰类增加的功能
    private String money() {
        return "这是摇钱树,结金子!";
    }

    //增强了功能的bearFruit方法
    @Override
    public String bearFruit() {
        return super.bearFruit() + "," + money();
    }
}

客户端代码:

public class Client {

    public static void main(String[] args) {
        // 创建目标类
        Plant plant = new Tree();

        // 创建装饰类,添加目标类的引用
        Plant moneyTree = new TreeDecorator(plant);

        // 执行增强后的结果方法,bearFruit()
        System.out.println(moneyTree.bearFruit());
    }
}

运行结果:


树结果子,这是摇钱树,结金子!

 


总结

使用场景:

  • 替代继承,扩展一个类的功能
  • 动态的给一个对象添加功能,以及动态的撤销该功能

优点:

  • 动态扩展一个实现类的功能,在不需要添加功能的时候,可以撤销装饰。
  • 装饰类和被装饰类模块间,通过抽象产生依赖,不会相互耦合
  • 装饰模式替换继承,可以避免继承链的子类被影响

装饰模式与代理模式的区别

  • 装饰模式:侧重给一个实现类动态添加功能,不会对实现类的方法进行过滤拦截
  • 代理模式:侧重将一个实现类的功能,委托给代理类来处理,可以对实现类的方法进行过滤拦截(某种情况下,可能不执行实现类的方法)

 

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’ 本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。 阅读详情

相关推荐

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 254

代理模式和装饰模式的区别

1、代理模式就是为其他对象提供一种代理以控制对这个对象的访问,最终都是通过代理类对象来访问,被代理的类对外是隐藏的,只能看到代理类。 2、装饰器模式强调的是增强自身,动态地给一个对象增加一些额外的职责。被装饰都可以被访问,只是功能被增强。

weixin_40017062的博客 4702

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发STM32H750VB使用STM32CUBEMX生成工程IAR+J-LINK调试准备工作CUBEMX生成的代码问题所在如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U

qq_37433166的博客 5345

面试官问:代理模式和装饰者模式有啥区别

今天面试聊到了模式。 面试官问:装饰者模式了解吗,讲一下? 我:blabla... 面试官:那代理模式呢? 我:blabla.....(说完感觉怎么都一样呢) 果然,面试官又问了:那两者有什么区别呢? 我: ....懵.........懵.........懵.........懵......... 首先呢来看一下定义。 一、代理模式 代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理模式是一项基本的设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上也...

SPACESTUDIO的博客 1万+

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5567

2021.02.23丨Virsorter2安装使用及答疑

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

4836

Java设计模式(六)装饰器模式-与代理模式的区别-项目实战应用

装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责;感觉有点儿类似于继承,不改变父类,子类可拓展功能; 和代理模式(代理设计模式) 真是太像了,简直一摸一样场景: 项目一期开发的时候,并没有给鉴权部分设置缓存;二期开发考虑到性能问题,想要给鉴权部分加上缓存,这里就选择了使用装饰器模式处理...

孔明的博客 3967

TGAT Python:图神经网络中的动态图算法

其中,图神经网络中的动态图算法成为了研究的热点之一。在模型的 forward 方法中,通过循环调用 TGATLayer 实例来进行图神经网络的前向传播。最终,模型返回图中节点的表示向量 output,可以用于图分类等任务。TGAT 算法的核心思想是在节点之间建立注意力连接,以捕捉节点在不同时间步之间的关系。TGAT 算法通过引入注意力机制和时间信息,从而有效地对动态图数据进行建模和分析。通过以上 Python 代码,我们可以方便地构建和训练 TGAT 模型,并在图分类任务中应用它。

2301_79366435的博客 1829

Java 设计模式:代理模式、适配器模式与装饰器模式的区别于联系

在软件开发过程中,设计模式起着至关重要的作用,它们能够帮助开发者更高效地解决常见的软件设计问题,提高软件的质量和可维护性。代理模式、适配器模式和装饰器模式是三种较为常用且容易混淆的设计模式,本文将深入剖析它们之间的区别,以帮助读者更好地理解和运用这些设计模式。

weixin_69477306的博客 1451

《Python等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级谁》Python编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,限时9.9元,欢迎订阅!

人生就是一个不断学习的过程 1880

ABAP 大规模数据并行处理实战,六套 Parallel Processing Framework 如何选,性能调优真正该盯住什么

如果今天真的面对那份执行 14 个小时的生产报表,我不会马上把原来的 Loop 改成 50 个aRFC。我会先用 SAT、ST12、SQL Monitor 和 HANA 侧工具确认时间到底花在哪里。如果 90% 时间其实消耗在一条低效 SQL 上,Parallel Processing 只是让 50 个 Worker 同时执行那条低效 SQL,数据库会比原来更痛苦。应该先把串行逻辑本身优化到合理水平。该做 Set-based Processing 的地方先交给 HANA。该避免SELECT。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 151

代理模式和装饰者模式的区别

装饰者模式和代理模式的区别 前言 这个问题其实是在面试字节的时候,面试官提出来的问题。刚听到这个问题的时候一脸懵,这不是两种设计模式吗?根本没什么关联呀!这是要问啥,后来仔细回想了装饰者模式和代理模式,发现确实有很多相似的地方。 ​ 代理模式:将你并不关心的事情交给别人做 ​ 装饰者模式:拓展自己的能力能做更多的事 一、代理模式 ​ 代理模式就不详细赘述了,可以参考https://www.runoob.com/design-pattern/proxy-pattern.html 二、装饰者模

weixin_42111147的博客 4757

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 827

设计模式——装饰模式详解

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。 装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。 前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式之装饰模式

本文介绍了装饰模式的理论与实现。装饰模式能动态地为对象添加职责,比继承更灵活。文章首先阐述了装饰模式的结构,包含抽象构件、具体构件、抽象装饰类和具体装饰类4个角色,并给出了UML类图。然后介绍了透明和半透明两种装饰模式的区别,以及省略抽象装饰类的简化方式。最后通过Java代码示例演示了透明和半透明装饰模式的实现,分别以GUI组件添加滚动条和图形添加阴影效果为例。装饰模式适用于需要动态扩展对象功能且避免继承导致类爆炸的场景,但会增加系统复杂度。完整代码已上传至GitHub仓库。

C2961034922的博客 983

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式---装饰模式(DesignPattern_Decorator)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 117

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式 | 装饰模式

1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求。 相片的包装,照相馆中把原相片清洗出来后,会对上面做些包装/装饰,相片镀膜,添加相框等处理,让整体更加美观,防潮保存更长的时间。 在软件设计中,类似上面的场景我们也可以把对象在不改变结构的情况下对其加工扩展修饰,使得对象具有更加强大的功能,这种技术在设计模式中就叫装饰模式。装饰模式可以在不改变一个对象本身功能的基

ChaITSimpleLove的博客 4770

设计模式Python版 装饰模式

介绍了GOF设计模式中的装饰模式,用Python实现装饰模式的示例,以及装饰模式在Django中的应用。

分享、交流、合作 1284

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

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.youkuaiyun.com/zhshulin 1、概念         装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。         但是纯粹的装饰模式很难找到,大多数的装饰模式的实现

在路上 5万+

【设计模式】用Java实现装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式它允许在不改变现有对象结构的情况下,动态地将责任附加到对象上。装饰模式通过将对象包装在装饰器对象中,形成一条装饰链,每个装饰器对象都可以在被装饰对象的行为前后加上自己的行为。装饰模式的核心思想是通过组合而不是继承来扩展对象的功能。它遵循开放-关闭原则,即对扩展开放,对修改关闭,使得我们可以在不修改现有代码的情况下,灵活地添加新的功能。应用场景:需要在不改变现有对象结构的情况下,动态地为对象添加额外的功能。

分享Java硬核干货 1万+

Java设计模式-装饰模式

装饰模式是一种非常有用的设计模式,它可以动态地为对象添加新的功能,而不需要修改原有的代码。通过定义一个抽象的装饰器类和具体的装饰器类,我们可以非常方便地扩展对象的功能,以满足不同的业务需求。虽然装饰模式增加了代码的复杂性和运行时开销,但是它在许多情况下仍然是一种非常有效的解决方案。

小薯条的博客 703

装饰模式——初学JAVA设计模式

文章目录一、基本概念模式角色二、简单实例实例一、变形金刚类图代码实现结果截图实例二、喜羊羊与灰太狼类图方式一:透明模式代码实现结果截图方式二:半透明模式+透明模式代码实现结果截图三、透明模式和半透明模式的区别辨析透明模式半透明模式四、小结优缺点适用场景 一、基本概念 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。 装...

发子鸡的博客 1497

设计模式-装饰模式

1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景: 需要扩展一个类的功能,或给一个类增加附加功能 需要动态地给一个对象增加功能,这些功能可以再动态地撤销 需要为一批的兄弟类进行改装或加装功能,当

黄俊彬 1627

Java设计模式之装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,用于在运行时动态地给对象添加额外的职责,而无需通过继承来扩展对象的功能。

LHR__123的博客 642
上一篇: Spring事务整理篇
下一篇: HTTP get和post方法总结
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值