装饰大师——装饰模式(Java实现)

引言

大家好,上期我们介绍了装饰模式在Python中的实现,今天,我们将继续探讨装饰模式,并展示如何在Java中实现它。

装饰模式概述

装饰模式的核心思想是将功能附加到对象上,而不是通过继承来实现,这种模式包含以下几个关键组成部分:

  1. 组件接口:定义基本功能;
  2. 具体组件:实现基本功能的类;
  3. 装饰器基类:实现组件接口,并包含一个指向组件对象的引用;
  4. 具体装饰器:扩展装饰器基类,实现额外的功能。

装饰模式与其他设计模式(如代理模式、适配器模式)不同之处在于,装饰模式注重动态地为对象添加职责,而不改变对象的接口。

模式结构

类图

示意图

装饰模式的Java实现

在Java中,装饰模式通常通过继承和组合来实现。以下是几种常见的实现方式:

基本实现

以下是一个简单的装饰器例子,它为组件添加打印日志的功能:

// 组件接口
interface Component {void operation();
}// 具体组件
class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("Executing operation in ConcreteComponent");}
}// 装饰器基类
abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();}
}// 具体装饰器
class LoggingDecorator extends Decorator {public LoggingDecorator(Component component) {super(component);}@Overridepublic void operation() {System.out.println("Logging before operation");super.operation();System.out.println("Logging after operation");}
}// 测试
public class DecoratorPatternExample {public static void main(String[] args) {Component component = new ConcreteComponent();Component decoratedComponent = new LoggingDecorator(component);decoratedComponent.operation();}
}
多层装饰器的使用

装饰器可以叠加使用,实现多层装饰:

class UppercaseDecorator extends Decorator {public UppercaseDecorator(Component component) {super(component);}@Overridepublic void operation() {System.out.println("Converting to uppercase");super.operation();System.out.println("Converted to uppercase");}
}public class MultiDecoratorExample {public static void main(String[] args) {Component component = new ConcreteComponent();Component decoratedComponent = new LoggingDecorator(new UppercaseDecorator(component));decoratedComponent.operation();}
}

实际应用案例

装饰模式在实际项目中有很多应用场景,例如日志记录、权限验证和性能监控等。

日志记录功能的装饰

通过装饰器为组件添加日志记录功能,可以避免在每个组件中重复写日志代码:

class LoggingDecorator extends Decorator {public LoggingDecorator(Component component) {super(component);}@Overridepublic void operation() {System.out.println("Logging before operation");super.operation();System.out.println("Logging after operation");}
}public class LoggingExample {public static void main(String[] args) {Component component = new ConcreteComponent();Component loggingComponent = new LoggingDecorator(component);loggingComponent.operation();}
}
权限验证功能的装饰

通过装饰器为组件添加权限验证功能,可以在调用实际业务逻辑之前进行权限检查:

class PermissionDecorator extends Decorator {public PermissionDecorator(Component component) {super(component);}@Overridepublic void operation() {if (hasPermission()) {super.operation();} else {System.out.println("Access denied");}}private boolean hasPermission() {// 模拟权限验证逻辑return true; // 可以根据实际情况修改}
}public class PermissionExample {public static void main(String[] args) {Component component = new ConcreteComponent();Component permissionComponent = new PermissionDecorator(component);permissionComponent.operation();}
}
性能监控功能的装饰

通过装饰器为组件添加性能监控功能,可以方便地记录组件的执行时间:

class TimingDecorator extends Decorator {public TimingDecorator(Component component) {super(component);}@Overridepublic void operation() {long startTime = System.currentTimeMillis();super.operation();long endTime = System.currentTimeMillis();System.out.println("Operation took " + (endTime - startTime) + " milliseconds");}
}public class TimingExample {public static void main(String[] args) {Component component = new ConcreteComponent();Component timingComponent = new TimingDecorator(component);timingComponent.operation();}
}

装饰模式的优缺点

优点
  1. 单一职责原则:可以将职责划分到不同的类中,使每个类的功能更加单一和明确;
  2. 动态扩展功能:可以在运行时添加或删除功能,而无需修改原有代码;
  3. 灵活性高:通过不同的装饰器组合,可以实现多种不同的功能扩展;
  4. 减少代码重复:可以避免在多个类中重复实现相同的功能,减少代码冗余。
缺点
  1. 增加复杂性:装饰器的嵌套使用可能会导致代码结构复杂,不易理解和维护;
  2. 调试困难:由于装饰器改变了函数的行为,调试时可能不容易追踪到问题的根源;
  3. 性能开销:多层装饰器可能会增加函数调用的开销,影响性能。

应用场景

装饰模式适用于以下场景:

  1. 需要动态添加功能:例如为已有功能添加日志记录、性能监控或权限验证等;
  2. 功能扩展频繁:例如在项目中需要经常为不同对象添加或移除功能;
  3. 不希望修改原有代码:例如在使用第三方库时,不希望直接修改其源代码,而是通过装饰器来扩展其功能;
  4. 跨切面关注点:例如在面向切面编程中,装饰模式可以用于处理日志、事务管理、异常处理等横切关注点。

总结

通过这篇文章,希望读者能够更好地理解装饰模式在Java中的实现,并能够在实际开发中灵活应用这种设计模式。如果你有任何疑问或想法,欢迎在下方留言!别忘了关注我们的公众号,获取更多有趣的编程知识和实用的代码技巧,我们期待与你的交流与分享!
在这里插入图片描述

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

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

相关文章

蓄势赋能 数智化转型掌舵人百望云杨正道荣膺“先锋人物”

2024年,在数据与智能的双涡轮驱动下,我们迎来了一个以智能科技为核心的新质生产力大爆发时代。在数智化浪潮的推动下,全球企业正站在转型升级的十字路口。在这个充满变革的时代,企业转型升级的道路充满挑战,但也孕育着…

每日一题系列-两个数组的交集

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” class Solution { public:int hash[1010] {0};vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;for(a…

WPF用户登录界面设计-使用SQLite数据库进行存储

一、SQLite数据库介绍 SQLite是一款轻量级的关系型数据库&#xff0c;它小巧高效&#xff0c;无需服务器配置&#xff0c;仅需单一文件即可存储数据。SQLite跨平台支持&#xff0c;易于集成到各种应用程序中&#xff0c;并支持SQL语言进行数据操作。它保证了数据的完整性、一致…

计算机网络03

文章目录 重传机制超时重传快速重传SACK 方法Duplicate SACK 滑动窗口流量控制操作系统缓冲区与滑动窗口的关系窗口关闭糊涂窗口综合症 拥塞控制慢启动拥塞避免算法拥塞发生快速恢复 如何理解是 TCP 面向字节流协议&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xf…

免费【2024】springboot 滁州市特产销售系统

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

vue2学习 -- 核心语法

文章目录 前置简介1. 模板语法2. 数据2.1 数据绑定2.2 el与data的两种写法2.3 MVVM模型2.4 Object.defineProperty2.5 Vue中的数据代理 3. 事件3.1 事件处理3.2 事件修饰符3.3 键盘事件 4. 计算属性5. 监视(侦听)属性5.1 书写形式5.2 深度监视5.3 简写形式5.4 计算属性和监听属…

大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

美团2024年春招第一场笔试[测开方向],编程题+选择题详解,ACM式C++解法

编程题&选择题 编程题小美的平衡矩阵思路代码 小美的数组询问思路代码 验证工号思路代码 选择题1.在计算机网络中&#xff0c;端口号的作用是什么2.HTTPS协议通过使用哪些机制来确保通信的安全性3.Etag用于标识资源的唯一标识符&#xff0c;他可以用于4.在一个单道系统中&a…

Nacos配置到springboot快速入门(笔记)

本人学习中的简单笔记&#xff0c;本文写的极其不详细&#xff0c;慎看&#xff01;&#xff01;&#xff01; Nacos 简介 Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集&#xff0c;帮助开发者快速实现动态服务发现、服务配置、服务元数据及…

CSCP、CPIM和CLMP三大证书的区别?如何选择?

在制造型企业、供应链和运营管理专业人士都会不断寻找方法来提升他们的技能和职业前景。三种流行的认证——CSCP&#xff08;Certified Supply Chain Professional&#xff09;、CPIM&#xff08;Certified in Planning and Inventory Management&#xff09;以及CLMP&#xff…

创客项目秀 | 基于xiao的光剑

在《星球大战》宇宙中&#xff0c;光剑不仅仅是武器;它们是持有者与原力的桥梁&#xff0c;制造一把光剑几乎是每个创客的梦想&#xff0c;今天给大家带来的是国外大学生团队制作的可伸缩光剑项目。 材料清单&#xff1a; 电机驱动模块1:90减速电机套装MP3模块、喇叭Xiao RP2…

一「骑」就LUCKY!凯迪拉氪强劲动力,带你一路顺畅,幸运随行!

好运&#xff0c;其实就是毫不费劲的完成心里所想的事情。简单来说&#xff0c;是不需要太多努力&#xff0c;就能得到比较大的回报。每个人都希望自己拥有好运气&#xff0c;但这就跟抽盲盒一样&#xff0c;可能穷极一生都享受不到。 所以&#xff0c;与其期待虚无缥缈的好运…

爬虫问题---ChromeDriver的安装和使用

一、安装 1.查看chrome的版本 在浏览器里面输入 chrome://version/ 回车查看浏览器版本 Chrome的版本要和ChromeDriver的版本对应&#xff0c;否则会出现版本问题。 2.ChromeDriver的版本选择 114之前的版本&#xff1a;https://chromedriver.storage.googleapis.com/index.ht…

生成式AI在金融领域的研究与应用

引言 科技的进步日新月异&#xff0c;伴随着移动终端与网络的不断迭代&#xff0c;人工智能领域也从专家系统到卷积神经网络&#xff0c;从Transform到生成式AI&#xff0c;乃至未来的AGI&#xff0c;不断改变我们的生活方式&#xff0c; 科技发展驱动人类社会加速迈向全面智能…

无人机之交通管理篇

无人机技术已经渗透到社会的各个领域&#xff0c;其中交通监控与管理便是其应用的重要方向之一。无人机凭借其独特的优势&#xff0c;如高效性、灵活性、实时性等&#xff0c;为交通监控与管理带来了革命性的变革。 一、无人机在交通监控中的应用 1、实时监控与数据采集 无人…

SuperMap iDesktopXiClient3D for WebGL 基于确定性空间插值生成水体流场

目录 摘要1 原始数据解析2 数据空间插值2.1流场UVW0.dat文件转xlsx2.2生成流场点数据2.3生成U、V栅格数据2.4裁剪U、V栅格数据2.5生成零值棋盘网格2.6生成U、V棋盘栅格 3 棋盘栅格转棋盘点3.1U、V棋盘栅格矢量化3.2U、V字段追加3.3流场数据JSON标准解析3.3.1流场数据JSON范例3.…

数据结构与算法-索引堆及其优化

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、索引堆…

基于SpringBoot+Vue的档案管理系统(带1w+文档)

基于SpringBootVue的档案管理系统(带1w文档) 基于SpringBootVue的档案管理系统(带1w文档) 随着信息化的不断发展&#xff0c;科技的进步也越来越大。软件编程是一个不断发展的行业&#xff0c;每个行业都必须进行适合自身特点的系统开发&#xff0c;才能在机构中生存和发展。当…

区块链技术在智能城市中的创新应用探索

随着全球城市化进程的加速和信息技术的快速发展&#xff0c;智能城市成为了未来城市发展的重要方向。在智能城市建设中&#xff0c;区块链技术作为一种去中心化、安全和透明的分布式账本技术&#xff0c;正逐渐展现出其在优化城市管理、提升公共服务和增强城市安全性方面的潜力…

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM&#xff08;大型语言模型&#xff09;的生成式人工智能。简而言之&#xff0c;这些模型是在大量数据&#xff08;包括一堆在线可用的 SQL 查询&#xff09;上进行训练的&#xff0c;并通过预测响应提示中最…