Java23种设计模式-结构型模式之装饰器模式

装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。这种模式提供了一种灵活的方式来扩展对象的功能,而不需要修改原始类的代码
通常有以下角色:
角色1.抽象组件(Component):定义对象的基本接口
角色2.具体组件(Concrete Component):实现抽象组件的具体类
角色3.抽象装饰器(Decorator):继承抽象组件,用于添加额外功能
角色4.具体装饰器(Concrete Decorator):实现抽象装饰器,具体添加特定的功能。

优点包括:
1.灵活性:可以在运行时动态地添加或移除功能。
2.可扩展性无需修改原始类,就能添加新的装饰器
3.复用性可以重复使用装饰器来构建不同功能组合
4.独立性:装饰器与具体类解耦,更易于测试和维护。

应用场景
1.扩展性需求:当需要在不修改现有代码的基础上,为对象添加新的功能或行为时。
2.功能组合:可以将多个装饰器组合在一起,以构建复杂的功能。
3.动态配置:在运行时根据具体情况动态地添加或移除装饰器。
4.独立扩展:不同的装饰器可以独立进行扩展和修改,互不影响。
5.性能优化:通过添加装饰器来优化对象的性能。
例如
1.图形界面组件:可以为组件添加边框、颜色、阴影等装饰。
2.文件操作如添加加密、压缩等功能
3.数据库操作例如添加日志记录、性能监控等
4.网络通信:如添加数据加密、协议转换等。
5.游戏角色:为角色添加各种技能或特效。

示例:定义了一个Component接口,它有一个operation方法。然后我们创建了一个具体的组件ConcreteComponent,它实现了Component接口。
接着,我们定义了一个Decorator抽象类,它同样实现了Component接口,并持有一个Component类型的成员变量。Decorator类的operation方法会委托给这个成员变量。
之后,我们创建了两个具体的装饰器ConcreteDecoratorA和ConcreteDecoratorB,它们都继承自Decorator类,并且各自添加了不同的行为。
最后具体整合测试

//定义组价接口
public interface Component {void operation();
}
// 定义具体组件
public class ConcreteComponent implements Component{@Overridepublic void operation() {System.out.println("ConcreteComponent operation executed.");}
}
// 定义装饰器抽象类
public class Decorator implements Component{protected Component component; // 被装饰的对象public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();}
}
// 定义具体装饰器A
public class ConcreteDecoratorA extends Decorator{public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedBehavior(); // 添加的行为}private void addedBehavior() {System.out.println("ConcreteDecoratorA added behavior executed.");}}
// 定义具体装饰器B
public class ConcreteDecoratorB extends Decorator{public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation(){super.operation();anotherAddedBehavior(); // 另一个添加的行为}private void anotherAddedBehavior() {System.out.println("ConcreteDecoratorB added behavior executed.");}
}
//具体整合测试
public class DecoratorPatternDemo {public static void main(String[] args) {Component component=new ConcreteComponent();Component decoratorA=new ConcreteDecoratorA(component);Component decoratorB=new ConcreteDecoratorB(decoratorA);decoratorB.operation();}
}

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

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

相关文章

504网关超时可能是哪些原因导致

当前随时互联网的发展普及,我们经常会使用到网站服务,许多网站为了提高打开速度,都会接入使用CDN。当我们在浏览网页或使用网络服务时,有时候可能有遇到网站打不开的情况,出现各式各样的错误代码,其中504网…

【注解和反射】通过反射动态创建对象、调用普通方法、操作属性

继上一篇博客【注解和反射】获取类运行时结构-CSDN博客 目录 八、通过反射动态创建对象 测试:通过反射动态创建对象 思考:难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器并将参数传递进去之后,才可以实…

bundle的下载和使用

1.bundle 的概要 BundleBundle 是一个嵌入式压缩库(嵌入是指直接嵌入到代码中,可以直接使用无需编译),支持 23 种压缩算法和 2 种存档格式。 2.bundle 的使用 使用的时候只需要手动拷贝添加两个 bundle.h 和 bundle.cpp 文件即…

三维图形程序员必学-CGAL几何算法

GCAL几何算法库,涵盖了很多数学几何算法,矩阵运算、平面拟合、曲线拟合、曲面重建、网格优化、网格剖分、面线相交、布尔运算等等各种图形学几何相关的算法。 文章最后放了一个CGAL求点集拟合平面,投影求线的例子代码。 CGAL是一个开源代码库,官网连接GitHub - CGAL/cgal…

网络安全之弱口令与命令爆破(上篇)(技术进阶)

目录 一,什么是弱口令? 二,为什么会产生弱口令呢? 三,字典的生成 四,使用Burpsuite工具弱口令爆破 总结 一,什么是弱口令? 弱口令就是容易被人们所能猜到的密码呗,…

Linux动态追踪——eBPF

目录 摘要 1 什么是 eBPF 2 eBPF 支持的功能 3 BCC 4 编写脚本 5 总结 6 附 摘要 ftrace 和 perf 与 ebpf 同为 linux 内核提供的动态追踪工具,其中 ftrace 侧重于事件跟踪和内核行为的实时分析,perf 更侧重于性能分析和事件统计,与…

脚本:监控Oracle中正在运行的SQL

这是我自己平时用的一个监控Oracle中正在运行的SQL的脚本,有需要的请收藏,运行时直接复制和粘贴即可。 col inst_sid heading "INST_ID|:SID" format a7 col username format a10 col machine format a12 col sql_exec_start heading "…

vim+xxd 编辑16进制

1. vim -b mib 2. 在vim 中执行 %!xxd, 这样就可以输入16进制: 3. 输入完成后,在vim中 执行 %!xxd -r 切换至原模式; 4. 保存退出即可 5. 重新打开mib文件:vim -b mib 6. 在vim 中执行 %!xxd, 查看是否符合预期:…

c++实战篇(二)——基于自旋锁实现的日志服务模块

前言 日志模块一直是服务端开发比较重要的部分,而在实际应用中向日志中进行写入的操作往往不是单线/进程的,而在多进/线程中如何实现对共享资源的保护,就成了一个比较重要的问题,而在实际开发中我们常常会利用锁机制来实现对共享内存的保护,…

学习java第五十一天

解释不同方式的自动装配 。 有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。 no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。 byName:通过参数名 自动装配,Spring 容…

如何理解GDP、国民总收入(GNI)的区别和联系

国内生产总值和国民总收入是衡量一个国家(地区)经济状况和发展水平的两个重要总量指标。两者既有密切的联系,又有一定区别,用途都非常广泛。 一、GDP与GNI的基本概念 国内生产总值(Gross Domestic Product,GDP)&…

遇到PHP方法 二维数组随机排序shuffle 二维数组筛选搜索array_filter

在做二维数组随机排序的时候,发现shuffle 函数挺好用,就不用在做负载的数组随机排序了,对于二维数组同样可以随机排列 php中的shuffle()函数是一个非常有用的函数,常用于随机重排数组中的元素。这个函数可以在很多开发场景中&…

一个联合均值与方差模型的R包——dglm

目录 一、引言二、包的安装与载入三、模拟例子3.1 数据生成3.2 数据查看3.3 模型估计参数 一、引言 在 R 语言中,dglm 包是用于拟合双参数广义线性模型(Double Generalized Linear Models,简称 DGLMs)的一个工具。这类模型允许同…

模块三:二分——162.寻找峰值

文章目录 题目描述算法原理解法一:暴力查找解法二:二分查找 代码实现解法一:暴力查找解法二:CJava 题目描述 题目链接:162.寻找峰值 根据题意,需要使用O(log N)的时间复杂度来解决,得出本道题…

.rmallox勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言: 在当今数字化的时代,计算机病毒已成为网络安全的一大威胁。其中,.rmallox勒索病毒以其高度的隐蔽性、快速的传播速度、巨大的危害性和不断变种的特性,引起了广大用户的关注。本文将详细解析.rmallox勒索病毒的特点&#xf…

在美国站群服务器部署时如何保障从253个IP到1000个IP的无缝扩展?

在美国站群服务器部署时如何保障从253个IP到1000个IP的无缝扩展? 在当今企业的数字化转型中,服务器的部署和管理成为了保证业务连续性和拓展性的关键。尤其对于站群服务器来说,随着企业业务的增长和市场的扩展,需要从较小规模的253个IP地址…

AWTK 异形进度条控件发布

异形进度条控件。通过多边形来定义进度条的形状。 代码地址:https://gitee.com/zlgopen/awtk-widget-progress-polygon 特性 通过多边形定义进度条的形状支持通过图片来定义进度条的背景支持通过图片来定义进度条的前景 使用图片填充比使用颜色填充消耗更多的内…

Debezium分享系列之:Debezium2.6稳定版本设置SQL Server数据库

Debezium分享系列之:Debezium2.6稳定版本设置SQL Server数据库 一、在 SQL Server 数据库上启用 CDC二、在 SQL Server 表上启用 CDC三、验证用户是否有权访问 CDC 表四、SQL Server Always On五、SQL Server 捕获作业代理配置对服务器负载和延迟的影响六、SQL Server 捕获作业…

速盾:常见的DDOS攻击类型有哪些?

DDoS(分布式拒绝服务)攻击是一种通过使目标系统超负荷而使其无法正常工作的网络攻击手段。在这种攻击中,恶意攻击者使用多个主机或设备(也被称为僵尸网络或机器人网络)来同时向目标系统发送大量的网络流量,…

数据结构练习-线性表定义与基本操作

----------------------------------------------------------------------------------------------------------------------------- 1. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不可以为空 C. 一个无限序列,可以为空…