【软考】设计模式之装饰器模式
目录
- 1. 说明
- 2. 应用场景
- 3. 结构图
- 4. 构成
- 5. 适用性
- 6. 优点
- 7. 缺点
- 8. java示例
1. 说明
- 1.动态地给一个对象添加一些额外的职责。
- 2.Decorator Pattern。
- 3.就增加功能而言,装饰器模式比生成子类更加灵活。
- 4.一种在不改变现有对象结构的情况下,动态地给对象增加一些职责(即增加额外功能)的设计模式。
- 5.属于对象结构型模式。
2. 应用场景
- 1.扩展功能:当需要给某个对象添加额外的功能,但又不想修改其源代码或结构时,可以使用装饰器模式。例如,在软件开发中,可以使用装饰器模式来扩展类的功能,而无需创建新的子类。
- 2.动态代理:装饰器模式允许在运行时动态地给对象添加或撤销功能。这对于需要动态修改对象行为的场景非常有用。
- 3.缓存功能:通过装饰器模式,可以为对象添加缓存功能,以提高系统的性能。例如,可以在数据访问层使用装饰器模式来缓存数据,减少对数据库的频繁访问。
- 4.日志记录:在系统中,经常需要记录对象的操作历史或状态变化。通过装饰器模式,可以轻松地给对象添加日志记录功能,方便后续的调试和错误追踪。
- 5.用户界面定制:在图形用户界面(GUI)设计中,可以使用装饰器模式来定制和扩展控件的功能。例如,可以为按钮添加动画效果、改变样式或添加额外的交互功能。
- 6.文件处理:在处理文件时,可以使用装饰器模式来添加各种文件处理功能,如压缩、加密、解密等。这样,用户可以根据需要选择不同的装饰器来处理文件。
- 7.网络请求:在发送网络请求时,可以使用装饰器模式来添加各种请求处理功能,如超时重试、身份验证、请求签名等。这些功能可以在不修改原始请求代码的情况下动态地添加到请求中。
- 8.数据处理:在处理数据时,可以使用装饰器模式来添加各种数据处理功能,如排序、过滤、转换等。这些功能可以根据需要动态地添加到数据处理流程中。
3. 结构图

4. 构成
- 1.Commponent(抽象组件):定义一个对象接口,可以给这些对象动态地添加职责。定义一个接口或抽象类,规定被装饰对象的行为。
- 2.ConcreteComponent(具体组件):定义一个对象,可以给这个对象添加职责。实现抽象组件接口或继承抽象组件类,是装饰器模式中的原始对象。
- 3.Decorator(抽象装饰器):维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。继承或实现抽象组件接口,并持有一个指向抽象组件的引用。抽象装饰器通常还包含一些用于增加额外功能的方法。
- 4.ConcreteDecorator(具体装饰器):向组件添加职责。继承抽象装饰器类,并实现具体的额外功能。具体装饰器可以根据需要添加多个,以实现不同的效果。
5. 适用性
- 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 2.处理那些可以撤销的职责
- 3.当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。
6. 优点
- 1.灵活性:装饰器是继承的有力补充,比继承更加灵活。它可以在不改变原有对象的情况下,动态地给一个对象扩展功能,实现即插即用。
- 2.可扩展性:通过使用不同的装饰类以及这些装饰类的排列组合,可以实现不同的效果,满足不同的需求。
- 3.遵循开闭原则:装饰器模式在扩展功能时,不需要修改原有类的代码,符合开闭原则(对扩展开放,对修改关闭)。
7. 缺点
- 1.增加复杂性:装饰器模式会增加许多子类,过度使用会增加程序的复杂性。
- 2.难以理解:如果装饰器类过多,可能会使代码变得难以理解和维护。
8. java示例
- 1.抽象组件
package com.learning.decorator.person;/*** 抽象组件* 定义一个人的接口* 获取人的描述*/
public interface Person {String getDescription();
}
- 2.具体组件
package com.learning.decorator.person;/*** 基础的人* 具体组件*/
public class BasePerson implements Person {/*** 人的姓名*/private String name; public BasePerson(String name) { this.name = name; } @Override public String getDescription() { return name; }
}
- 3.抽象装饰器
package com.learning.decorator.person;/*** 抽象装饰器* 衣服装饰器*/
public abstract class ClothingDecorator implements Person {//被装饰的对象protected Person person; public ClothingDecorator(Person person) { this.person = person; } @Override public String getDescription() { return decorate(person.getDescription()); } protected abstract String decorate(String description);
}
- 4.具体装饰器帽子装饰器
package com.learning.decorator.person;/*** 具体装饰器* 帽子装饰器*/
public class HatDecorator extends ClothingDecorator {public HatDecorator(Person person) { super(person); }/*** 帽子装饰,戴了一个帽子* @param description* @return*/@Override protected String decorate(String description) { return description + "戴了一个帽子";}
}
- 5.具体装饰器围巾装饰器
package com.learning.decorator.person;/*** 具体装饰器* 毛巾装饰器*/
public class ScarfDecorator extends ClothingDecorator {public ScarfDecorator(Person person) { super(person); }/*** 覆盖父类的方法, 戴了一条围巾* @param description* @return*/@Override protected String decorate(String description) { return description + "戴了一条围巾";}
}
- 6.客户端
package com.learning.decorator.person;public class Client {public static void main(String[] args) { Person person = new BasePerson("张三");System.out.println(person.getDescription());Person personWithHat = new HatDecorator(person);System.out.println(personWithHat.getDescription());Person personWithHatAndScarf = new ScarfDecorator(personWithHat);System.out.println(personWithHatAndScarf.getDescription());}
}
- 7.示例截图

相关文章:
【软考】设计模式之装饰器模式
目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.动态地给一个对象添加一些额外的职责。2.Decorator Pattern。3.就增加功能而言,装饰器模式比生成子类更加灵活。4.一种在不改变现有对象结构的情况下,动态地给对…...
网络编程day6
IO多路复用的原理 IO多路复用是一种通过同时监视多个文件描述符(通常是套接字)来处理多个I/O操作的机制。它的原理可以简单概括为: 单线程处理多个I/O操作:传统的I/O模型中,每个I/O操作都需要一个线程或进程来处理。而…...
5.23总结
新增功能点 讨论 学生和老师均可发布话题,话题发布后,在该课程的用户可以在发布话题的课程中点击讨论参与课程的讨论,并可以进行评论,回复评论,点赞操作。每个话题发布时可添加多个图片文件,参加讨论的话…...
SQL Server基础学习笔记
一. 什么是SQL Server? SQL Server是由微软公司开发的关系型数据库管理系统(RDBMS),它提供了存储、检索、处理和分析数据的功能。作为一种强大的数据库解决方案,SQL Server被广泛应用于企业级应用程序、Web应用程序、…...
用Vuex存储可配置下载的ip地址(用XML进行ajax请求配置文件)
1.在public文件夹下创建一个名为Configuration的文件在创建一个Configuration.txt里面就放IP地址(这里的名字可以随便命名一定性的被人解读文件含义) 例如: http://172.171.208.1:80032.在store文件夹中创建一个名为 ajaxModule.js 的 Vuex …...
Spring: OncePerRequestFilter
文章目录 一、介绍二、使用 一、介绍 OncePerRequestFilter是Spring Boot中的一个过滤器抽象类,它在Spring Security中也得到了广泛的应用。这个过滤器抽象类的主要目的是确保在每次外部请求时只执行一次过滤操作,对于服务器内部之间的forward等请求&am…...
《Python编程从入门到实践》day37
# 昨日知识点回顾 制定规范、创建虚拟环境并激活,正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…...
GBDT、XGBoost、LightGBM算法详解
文章目录 一、GBDT (Gradient Boosting Decision Tree) 梯度提升决策树1.1 回归树1.2 梯度提升树1.3 Shrinkage1.4 调参1.5 GBDT的适用范围1.6 优缺点 二、XGBoost (eXtreme Gradient Boosting)2.1 损失函数2.2 正则项2.3 打分函数计算2.4 分裂节点2.5 算法过程2.6 参数详解2.7…...
【考研数学】李林《880》是什么难度水平强化够用吗
880是公认的质量高,但要是刷的方法不对,心态直接炸裂!🙉 我24年二战就是用的 880660 的黄金搭档,143分逆袭上岸211!(为什么说逆袭呢,因为我23年一战数学83,妥妥的菜鸡&am…...
Flutter 中的 AnimatedAlign 小部件:全面指南
Flutter 中的 AnimatedAlign 小部件:全面指南 在 Flutter 中,动画是增强用户界面和提升用户体验的强大工具。AnimatedAlign 是 Flutter 提供的一个动画组件,它允许你动画化子组件的对齐方式。这在实现动态布局变化、响应式设计或交互式动画时…...
(Qt) 默认QtWidget应用包含什么?
文章目录 ⭐前言⭐创建🛠️选择一个模板🛠️Location🛠️构建系统🛠️Details🛠️Translation🛠️构建套件(Kit)🛠️汇总 ⭐项目⚒️概要⚒️构建步骤⚒️清除步骤 ⭐Code🔦untitled…...
测试环境KDE组件漏洞修复
yarn白名单方案 解决漏洞: 方案: 此方式主要使用iptables的功能,对yarn的resourceManager服务的8088端口进行访问ip限制,目的限制8088端口只允许集群内ip访问。 #分别在两台resourceManager节点执行以下步骤ssh kde-offline1 #安装iptables服务,并启动设置为开机自启 yum …...
微服务下认证授权框架的探讨
前言 市面上关于认证授权的框架已经比较丰富了,大都是关于单体应用的认证授权,在分布式架构下,使用比较多的方案是--<应用网关>,网关里集中认证,将认证通过的请求再转发给代理的服务,这种中心化的方式并不适用于微服务,这里讨论另一种方案--<认证中心>,利用jwt去中…...
使用 ASM 修改字段类型,解决闪退问题
问题 我的问题是什么? 在桥接类 UnityBridgeActivity 中处理不同 unity 版本调用 mUnityPlayer.destroy(); 闪退问题。 闪退日志如: 闪退日志说在 UnityBridgeActivity中找不到类型为 UnityPlayer 的属性 mUnityPlayer。 我们知道,Android…...
【python】python社交交友平台系统设计与实现(源码+数据库)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
Linux 实验报告3-4
(大家好,今天我们来学习Linux的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 实验三 vi编辑器 一、实验目的 二、实验内容 三、主要实验步骤 实验报告 1.进入 vi。 2.建立一个文件&…...
网络安全之BGP详解
BGP;边界网关协议 使用范围;BGP范围,在AS之间使用的协议。 协议的特点(算法):路径矢量型,没有算法。 协议是否传递网络掩码:传递网络掩码,支持VLSM,CIDR …...
【MySQL精通之路】SQL优化(1)-查询优化(8)-嵌套联接优化
主博客: 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇: 【MySQL精通之路】SQL优化(1)-查询优化(7)-嵌套循环联接-CSDN博客 下一篇: 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客 与SQL标准相比,…...
30V降8V、12V、24V3.5A车充降压芯片IC H4112 5V-30V
H4112确实是一款功能强大的异步降压型DC-DC转换器,它具备多种出色的特性和优势,使得它在电源管理领域有着广泛的应用。以下是对H4112主要特性和功能的详细解释: 内置30V耐压MOS: H4112内部集成了30V耐压的MOS管,这有…...
保护共享资源的方法(互斥锁)
我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》࿱…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
