装饰模式的定义

装饰模式(Decorator Pattern)是一种比较常见的模式,其定义如下:

Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)

在类图中,有四个角色需要说明:

Component抽象构件。Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component抽构件。

ConcreteComponent具体构件。ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。

Decorator装饰角色一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component抽象构件。

具体装饰角色ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西。

装饰模式应用

装饰模式的优点

装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件。

装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。装饰模式可以动态地扩展一个实现类的功能,这不需要多说,装饰模式的定义就是如此。

装饰模式的缺点

对于装饰模式记住一点就足够了:多层的装饰是比较复杂的。为什么会复杂呢?你想想看,就像剥洋葱一样,你剥到了最后才发现是最里层的装饰出现了问题,想象一下工作量吧,因此,尽量减少装饰类的数量,以便降低系统的复杂度。

装饰模式的使用场景

要扩展一个类的功能,或给一个类增加附加功能。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

最佳实践

装饰模式是对继承的有力补充。你要知道继承不是万能的,继承可以解决实际的问题,但是在项目中你要考虑诸如易维护、易扩展、易复用等,而且在一些情况下你要是用继承就会增加很多子类,而且灵活性非常差,那当然维护也不容易了,也就是说装饰模式可以替代继承,解决我们类膨胀的问题。

同时,你还要知道继承是静态地给类增加功能,而装饰模式则是动态地增加功能,如果你用继承就必须修改程序。

装饰模式还有一个非常好的优点:扩展性非常好。在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时地冒出一个需求,尤其是提出一个令项目大量延迟的需求时,那种心情是相当的难受!装饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类,而不是通过继承来完成,简单点说,三个继承关系Father, Son, GrandSon三个类,我要在Son类上增强一些功能怎么办?我想你会坚决地顶回去!不允许,对了,为什么呢?你增强的功能是修改Son类中的方法吗?增加方法吗?对GrandSon的影响呢?特别是GrandSon有多个的情况,你会怎么办?这个评估的工作量就够你受的,所以这是不允许的,那还是要解决问题的呀,怎么办?通过建立SonDecorator类来修饰Son,相当于创建了一个新的类,这个对原有程序没有变更,通过扩展很好地完成了这次变更。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916331.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916331.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916331.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[AI8051U入门第十步]W5500-客户端

学习目标: 1、认识W5500模块 2、驱动W5500静态获取ip 3、获取全球唯一码作为mac地址 4、拔出网线重插网线自动获取IP 5、编写W5500作为客户端进行TCP/IP代码一、W5500介绍 W5500 是一款由韩国 WIZnet 公司推出的高性能 硬件 TCP/IP 嵌入式以太网控制器,专为嵌入式系统设计,…

UNETR++: Delving Into Efficient and Accurate 3D Medical Image Segmentation

摘要得益于Transformer模型的成功,近期研究开始探索其在3D医学分割任务中的适用性。在Transformer模型中,自注意力机制是核心构建模块之一,与基于局部卷积的设计相比,它致力于捕捉长距离依赖关系。然而,自注意力操作存…

Kotlin Flow 在 Jetpack Compose 中的正确打开方式:SharedFlow vs StateFlow 与 LaunchedEffect

在 Jetpack Compose 中,Kotlin Flow 是处理异步数据流的核心工具,而 SharedFlow 和 StateFlow 是最常用的两种 Flow 类型。但很多开发者对它们的适用场景、如何与 LaunchedEffect 配合使用存在困惑。本文将深入探讨它们的区别,并给出最佳实践…

嵌入式——C语言:指针①

一、指针特点1.让代码更加简洁高效2.提供直接访问内存的操作3.利用指针可以直接操作硬件二、指针概念(一)地址:为了区分内存中不同字节的编号(0到2^16-1)(二)指针:指针就是地址&…

RabbitMQ—HAProxy负载均衡

上篇文章: RabbitMQ—仲裁队列https://blog.csdn.net/sniper_fandc/article/details/149312579?fromshareblogdetail&sharetypeblogdetail&sharerId149312579&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 HAProxy安装…

QT中启用VIM后粘贴复制快捷键失效

当在QT中启用FakeVim之后,Ctrl C 和 Ctrl V 快捷键就变成 Vim 的快捷键了,我希望它还是原来的复制粘贴功能,打开:编辑 > Preferences…,然后勾选 “Pass control keys”即可,如下:

TCP三次握手与四次挥手全解析

🌊 TCP三次握手与四次挥手全解析(含序列号动态追踪)🔑 TCP 协议核心机制 序列号 (seq):数据字节流的唯一标识(32位循环计数器)确认号 (ack):期望接收的下一个序列号(ack …

7月26号打卡

作业:题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一…

C++/CLI与标准C++的语法差异(一)

🌌 C/CLI与标准C的语法差异(一)🔬 第一章:类型系统革命 - 彻底解构三语言范式 🧪 1.1 类型声明语义差异矩阵 #mermaid-svg-L5kQ3iy05pKo4vIj {font-family:"trebuchet ms",verdana,arial,sans-se…

输电线路微气象在线监测装置:保障电网安全的科技屏障

在电力传输网络中,输电线路微气象在线监测装置通过集成专业传感器与智能分析技术,实现对线路周边环境参数的实时采集与动态分析,为电网运行安全提供数据支撑。该设备针对输电线路特殊工况设计,具备高适应性、高可靠性特点。工作原…

基于springboot的图书借阅系统

用户:借阅信息管理,续借信息管理,还书信息管理,图书信息,系统公告,留言板,我的中心管理员:图书信息管理,图书类型管理,借阅信息管理,续借信息管理…

Xinference vs SGLang:详细对比分析

概述对比特性XinferenceSGLang定位通用AI模型推理平台高性能LLM服务框架专注领域多模态模型统一接口LLM推理性能优化设计理念易用性和兼容性性能和效率核心架构对比 Xinference 架构特点 Xinference 架构: ├── API层(REST/CLI/Python) ├─…

双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥

一.经验分享个人情况:初试总分377,政治59,英语二75、数学二103、专业课140。本科为湖南一所双非一本,专业是电子信息工程,本科成绩一般,无奖学金无评优无科研竞赛,属于三无人员&…

配置DNS正反向解析

服务端master配置:yum install bind -y配置静态ip:修改配置文件:主:区域:正向解析:反向解析:开启服务:客户端node1配置:yum install nginx -y配置静态ip:使用xftp将文…

MyBatis-Plus 通用 Service

引言 在开发 Java Web 应用程序时,我们经常需要进行大量的数据库操作,如创建、读取、更新和删除(CRUD)。MyBatis-Plus 作为一个强大的 MyBatis 增强工具,为我们提供了通用 Service 接口,极大地简化了这些操…

聚类-一种无监督分类算法

目录 1、聚类任务 2、性能度量 (1)外部指标 (2)内部指标 3、具体聚类方法 (1)原型聚类 (2)密度聚类 (3)层次聚类 “无监督学习”(unsupervised learnin…

ES6 标签模板:前端框架的灵活利器

ES6(ECMAScript 2015)引入的模板字符串(Template Literals)为 JavaScript 开发者提供了更简洁的字符串处理方式,而模板字符串标签(Tagged Template Literals)则进一步扩展了其功能性。通过标签函…

解锁编程核心能力:深入浅出数据结构和算法

——为什么它们是你代码效率的终极武器? 🌟 引言:程序世界的基石 想象你正在建造摩天大楼:数据结构是钢筋骨架,决定建筑的结构与承重能力;算法则是施工蓝图,指导如何高效完成建造。两者结合&am…

Jenkins运行pytest时指令失效的原因以及解决办法

错误收集 Started by user 偷走晚霞的人 Running as SYSTEM Building in workspace C:\Users\Administrator\.jenkins\workspace\TestAAA [TestAAA] $ cmd /c call C:\Users\Administrator\AppData\Local\Temp\jenkins5821160869728612887.bat C:\Users\Administrator\.jenkins…

MySQL数据库本地迁移到云端完整教程

一、准备工作 安装MySQL客户端工具获取云端数据库连接信息: 主机地址端口号用户名密码数据库名二、本地数据库导出 mysqldump -h 127.0.0.1 -P 4406 -u root -p 数据库名 > backup.sql执行后会提示输入密码,完成后会在当前目录生成backup.sql文件 三、…