当前位置: 首页 > news >正文

java设计模式学习之【装饰器模式】

文章目录

  • 引言
  • 装饰器模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 装饰器模式在Spring中的应用
  • 画图示例
  • 代码地址

引言

在日常生活中,我们常常对基本事物添加额外的装饰以增强其功能或美观。例如,给手机加一个保护壳来提升其防护能力,或者在房间里添加装饰品以提升美观。这种增加附加功能的做法在软件开发中也有所体现,特别是在装饰器模式中。装饰器模式允许我们在不改变对象自身的基础上,为对象添加新的功能。这种模式在软件开发中非常有用,特别是当我们希望动态地、透明地为对象增加职责时。

装饰器模式简介

定义与用途

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许用户在不改变对象自身的基础上向一个对象添加新的功能。在这种模式中,我们通过创建一个包装对象,也称为装饰器,来包裹真实对象。

实现方式

实现装饰器模式通常包括以下几个关键组件:

  • 抽象组件(Component): 定义了一个对象接口,可以给这些对象动态地添加职责。
  • 具体组件(Concrete Component): 定义了抽象组件的具体实现,即被装饰的对象。
  • 抽象装饰器(Decorator): 持有一个组件(Component)对象的引用,并定义了符合组件接口的接口。
  • 具体装饰器(Concrete Decorator): 实现抽象装饰器的接口,并添加额外的功能。

使用场景

装饰器模式非常适合以下场景:

  • 当需要扩展一个类的功能时。
  • 当需要动态地为对象增加功能,且这些功能可以再动态地撤销。
  • 当扩展类的功能比创建子类更有弹性时。

例如:

  1. 图形用户界面组件装饰:在图形用户界面中,可以用装饰器模式给基本组件(如按钮、文本框等)动态添加一些附加功能,比如边框、阴影、鼠标悬停效果等。

  2. 数据流增强:在数据流处理中,如文件流、网络流等,装饰器模式可以用来动态地添加新的功能,比如数据加密、压缩、缓冲等。

  3. 权限控制:在一些应用程序中,根据用户的权限级别动态地给对象添加不同的行为(例如,对基本功能的访问权限控制)。

  4. 性能监控:在性能监控和日志记录中,装饰器可以被用来在不更改原有类的基础上,为方法或对象添加日志记录和性能监控的功能。

  5. 动态添加属性或行为:在需要为对象动态添加属性或行为的场景,比如在游戏开发中给角色添加不同的技能或状态效果,装饰器模式提供了一种灵活的解决方案。

  6. Web 服务中的中间件:在Web开发中,中间件可以看作是对HTTP请求或响应的装饰器,用于处理认证、日志记录、错误处理等。

优势与劣势

  • 优势
    增加对象功能: 装饰器模式提供了一种灵活的方式来增加对象的功能,与继承相比,这种方式更具灵活性。
    动态扩展: 可以在运行时动态地添加或删除功能。
    避免类爆炸: 减少了子类的数量,避免了类数量过多的问题。
  • 劣势
    增加系统复杂性: 添加装饰器可以使系统变得更加复杂,特别是当有很多层装饰时。
    维护困难: 更复杂的代码意味着维护起来更困难。

装饰器模式在Spring中的应用

1. Spring AOP(面向切面编程)
Spring AOP是装饰器模式的一个经典应用例子。在Spring AOP中,切面(Aspect)可被视为装饰器,它们为业务逻辑(如服务层的方法)提供了附加功能(例如,事务管理、日志记录、安全性检查等),而不修改原有功能的代码。通过代理模式结合装饰器模式,Spring AOP在运行时动态地向对象添加额外的行为。2. Spring I/O资源抽象
在Spring的资源抽象(如Resource接口和其实现类)中,装饰器模式被用来增强基础资源对象(如文件系统资源、类路径资源等)的功能。例如,BufferedInputStream是Java I/O的一个装饰器,Spring结合使用这些装饰器以提供高效的数据访问。3. Spring MVC的视图技术集成
Spring MVC框架通过使用装饰器模式,可以将不同的视图技术(如JSP、Freemarker、Thymeleaf)无缝集成到同一模型中。控制器返回模型和视图对象,而实际的视图可以是任何实现了View接口的对象,这些视图对象可以是装饰过的对象,提供了额外的渲染逻辑。4. Spring Security的身份验证和授权
Spring Security使用装饰器模式来增强或修改用户的身份验证对象(如UserDetails),并在安全上下文中添加额外的安全属性。这允许开发者在不改变现有身份验证逻辑的基础上,轻松地添加或改变认证信息。5. Spring的事务管理
在Spring的声明式事务管理中,装饰器模式被用于动态地添加事务管理逻辑到业务逻辑上。例如,通过使用@Transactional注解,Spring在运行时创建一个代理对象(装饰器),围绕着原始的bean实例,以提供事务管理的功能。6. Spring的数据访问集成
Spring的数据访问集成(如JdbcTemplate、HibernateTemplate等)也使用装饰器模式来提供额外的数据处理功能,比如异常翻译、资源管理等,而不改变原有数据访问逻辑。

画图示例

在这里插入图片描述
步骤 1: 创建图形一个接口。

public interface Shape {void draw();
}

步骤 2: 创建实现相同接口的具体类。

public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("图形:矩形");}}
public class Circle implements Shape{@Overridepublic void draw() {System.out.println("图形:圆形");}}

步骤 3: 创建实现 Shape 接口的抽象装饰器类。

public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape){this.decoratedShape = decoratedShape;}@Overridepublic void draw(){decoratedShape.draw();}}

步骤 4: 创建扩展 ShapeDecorator 类的具体装饰器类。给画图加上边框红边的功能

public class RedShapeDecorator extends ShapeDecorator{public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}@Overridepublic void draw() {decoratedShape.draw();setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape){System.out.println("边框颜色:红色");}}

步骤 5: 使用 RedShapeDecorator 来装饰 Shape 对象。

public class DecoratorPatternDemo {public static void main(String[] args) {Shape circle = new Circle();Shape redCircle = new RedShapeDecorator(new Circle());Shape redRectangle = new RedShapeDecorator(new Rectangle());System.out.println("带有普通边框的圆形");circle.draw();System.out.println("\n带有红色边框的圆形");redCircle.draw();System.out.println("\n带有红色边框的矩形");redRectangle.draw();}}

在这里插入图片描述
在这个具体示例中,展示的是如何使用装饰器模式为简单的形状对象(如圆形和矩形)添加新的功能(如设置边框颜色)。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

相关文章:

java设计模式学习之【装饰器模式】

文章目录 引言装饰器模式简介定义与用途实现方式 使用场景优势与劣势装饰器模式在Spring中的应用画图示例代码地址 引言 在日常生活中,我们常常对基本事物添加额外的装饰以增强其功能或美观。例如,给手机加一个保护壳来提升其防护能力,或者在…...

Ubuntu宝塔面板本地部署Emlog个人博客网站并远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...

简述IO流的使用以及使用时需要注意的事项

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍介绍IO流的使用以及使用时需要注意的事项以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可…...

西工大计算机学院计算机系统基础实验一(函数编写11~14)

稳住心态不要慌,如果考试周冲突的话,可以直接复制这篇博客和上一篇博客西工大计算机学院计算机系统基础实验一(函数编写1~10)-CSDN博客最后的代码,然后直接提交,等熬过考试周之后回过头再慢慢做也可以。 第…...

Spring 声明式事务

Spring 声明式事务 1.Spring 事务管理概述1.1 事务管理的重要性1.2 Spring事务管理的两种方式1.2.1 编程式事务管理1.2.2 声明式事务管理 1.3 为什么选择声明式事务管理 2. 声明式事务管理2.1 基本用法2.2 常用属性2.2.1 propagation(传播行为)2.2.2 iso…...

通达OA inc/package/down.php接口存在未授权访问漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一. 产品简介 通达OA(Office Anywhere网络智能办公系统&am…...

数据库原理: 笛卡儿积

笛卡儿积(Cartesian Product)是集合论中的一个概念,也在数据库中的查询操作中经常使用。笛卡儿积是指两个集合(或更多集合)之间所有可能的组合。如果有两个集合A和B,它们的笛卡儿积记作A B,表示…...

docker安装配置prometheus+node_export+grafana

简介 Prometheus是一套开源的监控预警时间序列数据库的组合,Prometheus本身不具备收集监控数据功能,通过获取不同的export收集的数据,存储到时序数据库中。Grafana是一个跨平台的开源的分析和可视化工具,将采集过来的数据实现可视…...

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值(对象或原始值)都可以作为键或值。 特性 Map中的一个键只能出现一次&am…...

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统(SOPC)的设计 在进行系统设计时,倘若系统非常复杂,采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式,工作量无疑是巨大的,这时调用 MicroBlaze 软核…...

PyQt pdf格式保存

参考文章 pyqt5:利用QFileDialog从本地选择图片\文本文档显示到label、保存图片\label文本到本地(附代码)_pyqt5中qfiledialog.getopenfileurl-CSDN博客 txt文件的打开与保存 def openTextFile(self): # 选择文本文件上传fd,fp QFileDialog.getOpen…...

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现…...

工业机器视觉megauging(向光有光)使用说明书(一,轻量级的visionpro)

机器视觉megauging(未名之光,向光有光)程序软件资源已经发布,欢迎下载尝新 8:11 2023/12/2 首先,既然觉得可以发表了,就发表。 其次,我这个人没写过什么软件使用说明书,既然走到这路…...

Java——面试:String 和 StringBuffer 的区别?

相同点: String 和 StringBuffer,它们可以储存和操作字符串, 即包含多个字符的字符数据。 String 和 StringBuffer 的区别有以下几点: 1.String 类提供了数值不可改变的字符串。而 StringBuffer 类提供的字符串进行修改。 当你知…...

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…...

vue项目下npm或yarn下安装echarts多个版本

最近在大屏展示的时候,用到了百度的echarts图表库,看完效果图后,又浏览了一下echarts官网案例,大同小异。但是搬砖过程中发现实际效果和demo相差甚远,一番折腾发现,项目中安装的是echarts4.x版本&#xff0…...

在内网开发中使用Nginx代理来访问钉钉新版服务端API

如果你在内网开发中使用Nginx代理来访问钉钉新版服务端API,你可以在Nginx配置文件中进行相应的配置。 以下是一个简单的示例Nginx配置,用于将对指定URL的请求代理到钉钉服务端API: server { listen 80; server_name your_server_domain; l…...

机器学习算法如何进行特征重要性评估

特征重要性评估是机器学习中一种常用的方法,用于确定输入特征对模型预测的贡献程度。以下是几种常见的机器学习算法进行特征重要性评估的方法: 1 决策树算法(如随机森林和梯度提升树):决策树算法可以通过计算每个特征…...

运行启动vue项目报报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS解决

报错的问题就是package.json中的Scripts下的dev 解决方法就是要不升级你的应用代码,支持 新版本的node.js 要不就是删除SET NODE_OPTIONS--openssl-legacy-provider &&代码,如下代码即可正常运行起来...

网工学习5 交换机端口相关配置

交换机的接口属性默认支待一般网络环境,一般情况下是不需要对其接口进行设置的。在某些情况下需 要对其端口属性进行配置时,配置的对象主要有接口隔离、速率、双工等信息。 5.1 接口隔离设置 > 配置接口 GE0/0/1 和 GE0/0/2 的接口隔离功能&#xf…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​:下载安装 ​​De…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...