结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式

前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一. 介绍

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

个人理解: java在编译完成后,我们无法动态的去为一个编译好的对象新增或者修改某个功能,这时候就可以通过装饰模式去设计

举例理解: 通常我们使用继承或者组合去扩展对象的行为,假如我们想要实现不同种类的手链,我们创建一个手链(Bracelet)接口,然后我们通过实现这个接口获取一个基本的手链(basic bracelet),我们可以在基本的手链的基础上进行扩展获得**金手链(Gold)和银手链(Silver)**结构图如下所示。

请添加图片描述

通过以上案例我们可以了解到,一些简单的扩展通过继承的方式就可以解决了,但如果我们还想在扩展,想要获取一个同时具备金色和银色的手链,并且还要添加某些功能,那么就会变得很复杂。如果手链类型增加,使用继承的实现逻辑就很难管理。这时候就可以通过装饰模式去设计

好了,上面的介绍都是再讲为什么要使用装饰模式,接下来就通过代码案例讲解装饰模式是怎么样子实现的,如何解决上面所说的问题

装饰模式有以下角色:

(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。

(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。

(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

二. 代码示例

装饰模式代码具体流程如下

请添加图片描述

2.1 抽象构件(Component)角色

定义要实现的方法的接口或抽象类

/*** @author chenyunzhi* @date 2024/6/3 16:06* @Description 手链*/
public interface Bracelet {void color();}

2.2 具体构件(Concrete Component)角色

/*** @author chenyunzhi* @date 2024/6/3 16:08* @Description 基本的手链,也就是白色*/
public class BasicBracelet implements Bracelet{@Overridepublic void color() {System.out.print("基本的白色手链");}
}

2.3 装饰(Decorator)角色

/*** @author chenyunzhi* @date 2024/6/3 16:23* @Description 手链装饰器*/
public class BraceletDecorator implements Bracelet {/*** 装饰器类应该可以访问组件变量,因此我们将保护该变量*/protected Bracelet bracelet;public BraceletDecorator(Bracelet bracelet) {this.bracelet = bracelet;}@Overridepublic void color() {this.bracelet.color();}
}

2.4 具体装饰(Concrete Decorator)角色

金手链

/*** @author chenyunzhi* @date 2024/6/3 16:32* @Description 金手链*/
public class GoldBracelet extends BraceletDecorator{public GoldBracelet(Bracelet bracelet) {super(bracelet);}@Overridepublic void color() {super.color();System.out.print(",增加金色");}
}

银手链

/*** @author chenyunzhi* @date 2024/6/3 16:37* @Description 银手链*/
public class SilverBracelet extends BraceletDecorator{public SilverBracelet(Bracelet bracelet) {super(bracelet);}@Overridepublic void color() {super.color();System.out.print(",增加银色");}
}

2.5 测试 结果

/*** @author chenyunzhi* @date 2024/6/3 14:39* @Description*/
public class DecoratorPatternTest {public static void main(String[] args) throws Exception{// 获取金手链对象Bracelet goldBracelet = new GoldBracelet(new BasicBracelet());goldBracelet.color();System.out.println("\n-----------------------");// 获取银手链对象Bracelet silverBracelet = new SilverBracelet(new BasicBracelet());silverBracelet.color();System.out.println("\n-----------------------");// 获取包含金色和银色的手链Bracelet goldSilverBracelet = new GoldBracelet(new SilverBracelet(new BasicBracelet()));goldSilverBracelet.color();}
}

请添加图片描述

通过以上结果我们可以看到,如果我们想要获取包含 金色和银色的手链,可以通过组合金色和银色的装饰者对象来获取具有金色和银色手链。

三. 结论

3.1 优缺点

优点:

  • 装饰器设计模式有助于提供运行时修改能力,因此更加灵活。当选择数量较多时,易于维护和扩展。
  • 装饰器设计模式的缺点是它使用了很多相似类型的对象(装饰器)。
  • Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点

  • 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  • 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  • 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

3.2 使用场景

  • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

    不能采用继承的情况主要有两类:

    • 第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;
    • 第二类是因为类定义不能继承(如final类)
  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

  • 当对象的功能要求可以动态地添加,也可以再动态地撤销时。

  • 装饰器模式在Java IO类中被大量使用,例如FileReader、BufferedReader等。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

只需5分钟!掌握学术写作的核心逻辑!

人工智能的广泛应用中,ChatGPT 已被证明是一种极具潜力的语言模型,其功能涵盖多个领域,显示出强大的适应性。在 GPT-4 架构的推动下,ChatGPT 正在彻底改变我们与文本驱动的人工智能的交互模式。 在学术界,学术写作至关…

【测试】——Selenium API (万字详解)

📖 前言:本文详细介绍了如何利用Selenium进行Web自动化测试,包括定位元素(如cssSelector和xpath)、常用操作函数(如点击、输入等)、窗口管理、键盘鼠标事件和浏览器导航,以及处理弹窗…

实用小工具——多标签页插件Office Tab介绍

Office Tab引入选项卡式用户界面,增强了Microsoft Office使用体验。软件界面,可以设置你喜欢的标签类型。 安装后office界面会新增一个办公标签栏,立面有各功能说明。 最常用的是这个标签切换功能。 安装也很简单,选择对应位数安装…

知识产权实缴出资是否合法

知识产权实缴出资是否合法 近年来,随着知识产权在企业价值中的重要性日益凸显,知识产权实缴出资作为一种新兴的出资方式,逐渐受到社会各界的关注。然而,关于知识产权实缴出资是否合法的问题,一直是企业和投资者关注的焦…

vulnhub(13):LordOfTheRoot(sql时间盲注、mysql udf提权)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.170 Host is up (0.00020s latency). ​ 170是新出现的机器,他就是靶机 nmap端口扫描 nmap -Pn 192.168.72.170 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/sca…

Sony IMX334LQR-C 1/1.8寸 8.42 M像素

索尼IMX334LQR宽动态超星光级交通监测CMOS 封装:LGA 对⾓线:8.86 mm(类型1/1.8) 索尼IMX334LQR宽动态超星光级交通监测CMOS的参数及规格书资料: IMX334LQR-C是⼀个对⾓线8.86 mm(类型1/1.8)的…

帕金森病:这五大幕后推手,你了解多少?

在快节奏的现代生活中,健康问题日益受到公众的关注,而帕金森病作为一种常见的神经系统退行性疾病,更是牵动着无数家庭的心弦。今天,就让我们一起揭开帕金森病的神秘面纱,探讨其背后的五大主要原因,让更多人…

离散化c++

应用于数字取值范围很大,但数字个数很少的情况,原理是将要用到的数字放到一个连续的数组中,通过一个函数find得到数字和存放在数组中的下标的映射关系。 其中find函数的实现可以通过二分查找来实现; 练习题: 题意&…

Python 类型提示全解析:从入门到精通的必备技巧(如何让Python代码更清晰、错误更少)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是类型提示?📝 类型提示的基本用法📝 高级用法📝 类型提示的工具和技巧📝 注意事项和最佳实践⚓️ 相关链接 ⚓️📖 介绍 📖 在编程的世界里,代码的清晰和可维护性是成功的关键。尤其是在 …

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中,查询一个值需要一一比较,复杂度为O(N);在平衡树中,查询变为了二分查找,复杂度为O(logN);而对于哈希表,我们可…

SpringBoot简易商品管理系统

> 这是一个基于SpringBootThymeleaf实现的简易商品管理系统。 > 包含基本的登录/注册与商品管理功能。 > 界面简洁美观,代码结构清晰,适用于JAVA初学者在此基础上进行二次开发。 一、项目演示 二、技术框架 框架描述Spring Boot容器管理 S…

毫米波雷达预警功能 —— 开门预警(DOW)

文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用,转载请标明出处,谢谢配…

16代现场实拍图

64*32 全彩 LED 点阵显示屏 无线通信868M,跳频通信 通信速率200K/50K 覆盖20-30米以上的通信半径 尺寸:192*96mm 供电方式:24V外置电源 储存温度:-40℃~80℃ 工作温度:-20℃~50℃ 自定义双向通信协议&#xff…

工业无线路由器组网方案:简单方便的工业组网方案

​一、项目背景 随着工业互联网的发展,越来越多的企业开始寻求高效、稳定的网络解决方案,以支持其生产和管理的数字化转型。工业无线路由器在这一过程中扮演着重要的角色。本文将详细介绍基于星创易联SR500工业无线路由器的组网方案,适用于制…

解锁2024年翻译在线Top4,让每一次交流都精准无误

现在世界就像个大家庭,交流多了,语言不通就成了问题。有道翻译在线就像桥梁,帮我们和全世界的朋友沟通。对企业来说,翻译准确太重要了,一句话翻错可能损失巨大。有道翻译在线技术强,各种语言都能搞定&#…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~

本以为遥遥领先的GPT早就普及了,但小伙伴寻找使用的热度一直高居不下,其实现在很简单了! 国产大模型快200家了,还有很多成熟的国内AI产品,跟官网一样使用,还更加好用~ ① 3.5 大多数场景是够用的&#xff…

【贪心算法】贪心算法二

贪心算法二 1.最长递增子序列2.递增的三元子序列3.最长连续递增序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长递增子序列 题目链…

从零基础到大模型大师,看完这篇,效率提高99%!!

一、 前置知识 - 数学:主要包括线性代数、概率统计等内容。 - 自然语言处理:主要包括Word2vec、Seq2seq等内容。 - Python:Python语言是大模型应用的编程基础,需要熟练掌握深度学习相关的框架,如PyTorch、TensorFlow。…

【C++ Primer Plus习题】17.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> using namespace std;int main() {char …

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…