设计模式-装饰器模式
目录
- 设计模式-装饰器模式
- 什么是装饰器设计模式?
- java示例
设计模式-装饰器模式
什么是装饰器设计模式?
装饰器设计模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展其功能。装饰器模式能够在不改变原有对象的情况下,通过添加新的装饰器类来增加对象的功能。
在装饰器模式中,有一个抽象组件(Component)接口,定义了被装饰对象和装饰器对象的共同行为。然后有一个具体组件(ConcreteComponent)类,实现了抽象组件接口,并定义了基本的功能。接下来,有一个抽象装饰器(Decorator)类,也实现了抽象组件接口,并持有一个抽象组件对象的引用。最后,有一个具体装饰器(ConcreteDecorator)类,继承自抽象装饰器类,可以在不改变原有对象的情况下,通过添加新的功能来装饰被装饰对象。
装饰器模式的优点包括:
- 可以动态地扩展对象的功能,而无需修改原有对象。
- 可以通过组合多个装饰器来实现不同的功能组合。
- 可以灵活地添加或移除装饰器,以达到不同的功能需求。
装饰器模式常见的应用场景包括:
- 在不改变原有类的情况下,为类添加新的功能。
- 需要动态地为对象添加额外的行为。
- 需要在运行时对对象进行功能扩展。
总之,装饰器模式通过包装对象来实现动态的功能扩展,提供了一种灵活、可扩展的方式来修改对象的行为。
java示例
以下是一个简单的Java示例,演示了如何使用装饰器模式来扩展对象的功能:
首先,我们定义一个抽象组件接口 Component,它包含一个 doSomething() 方法:
public interface Component {void doSomething();
}
然后,我们创建一个具体组件类 ConcreteComponent,实现了抽象组件接口:
public class ConcreteComponent implements Component {@Overridepublic void doSomething() {System.out.println("Doing something...");}
}
接下来,我们定义一个抽象装饰器类 Decorator,它也实现了抽象组件接口,并持有一个抽象组件对象的引用:
public abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void doSomething() {component.doSomething();}
}
最后,我们创建一个具体装饰器类 ConcreteDecorator,继承自抽象装饰器类,并在 doSomething() 方法中添加额外的功能:
public class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}@Overridepublic void doSomething() {super.doSomething();System.out.println("Adding extra functionality...");}
}
现在,我们可以使用装饰器模式来扩展对象的功能:
public class Main {public static void main(String[] args) {// 创建一个具体组件对象Component component = new ConcreteComponent();// 使用具体装饰器来装饰组件对象Component decoratedComponent = new ConcreteDecorator(component);// 调用装饰后的对象的方法decoratedComponent.doSomething();}
}
输出结果为:
Doing something...
Adding extra functionality...
这个例子中,我们首先创建了一个具体组件对象 ConcreteComponent,然后使用具体装饰器 ConcreteDecorator 来装饰该组件对象。最后,调用装饰后的对象的 doSomething() 方法,即可在不改变原有对象的情况下,添加额外的功能。
相关文章:
设计模式-装饰器模式
目录 设计模式-装饰器模式什么是装饰器设计模式?java示例 设计模式-装饰器模式 什么是装饰器设计模式? 装饰器设计模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展…...
【Vs code调试C++】
参考文献第一个很重要 主要是配置task.json,其余的可以不用管 参考文献 [1]详解Linux下使用vscode编译运行和调试C/C [2]vscode关于C/C编译运行的一些小配置...
使用 C++创建一个简易的数据库管理系统 (DBMS)
在数据库领域,数据库管理系统 (DBMS) 是一个软件系统,它提供与用户、其他应用程序和数据库之间的接口,用于存储、检索、更新和管理数据。在这篇博客中,我们将学习如何使用 C 创建一个简易的 DBMS,包括事务、并发控制、…...
简单了解一下:NodeJS的WebSocket网络编程
NodeJS的webSocket网络编程。 那什么是WebSocket呢?WebSocket是HTML5提供的一种浏览器和服务器进行通信的网络技术。两者之间,只需要做一个握手动作,就可以在浏览器和服务器之间开启一条通道,就可以进行数据相互传输。 实现WebS…...
目标检测技术概述
什么是目标检测? 在计算机视觉众多的技术领域中,目标检测(Object Detection)也是一项非常基础的任务,图像分割、物体追踪、关键点检测等通常都要依赖于目标检测。在目标检测时,由于每张图像中物体的数量、…...
软件设计原则-开闭原则讲解以及代码示例
开闭原则 一,介绍 1.前言 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一条重要原则,它由Bertrand Meyer在其著作《面向对象软件构造》中提出,并成为SOLID原则之一。 开闭原则的核心思想是&…...
分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)
分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…...
LeetCode--180 连续出现的数字
文章目录 1 题目描述2 结果示例3 解题思路3.1 MySQL 代码 4 知识拓展 1 题目描述 Logs表: ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varchar | ----------------------在 SQL 中,id …...
面试算法34:外星语言是否排序
题目 有一门外星语言,它的字母表刚好包含所有的英文小写字母,只是字母表的顺序不同。给定一组单词和字母表顺序,请判断这些单词是否按照字母表的顺序排序。例如,输入一组单词[“offer”,“is”,“coming”…...
常用docker命令 docker_cmd_sheet
查看所有docker 容器 docker ps 查看 特定docker容器 比如con1 docker ps | grep con1 查看镜像 docker images 拉取镜像 docker pull imageXXX 打标签 docker tag imageXXX:1.4.0 镜像名冒号tag 按照docker-compose.yml 启动容器,在有docker-compose…...
算法进阶——数组中的逆序对
题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007 数据范围:对于 50% 的数据, size≤104 对…...
hackmyvm之gift
hackmyvm是一个平台,包含了大量靶机,类似于vulnhub、hackthebox等平台,你可以在上面下载靶机,进行渗透测试练习,非常适合热爱黑客技术或从事渗透测试的人员。 (这段解释参考这篇文章) 下载安装…...
1024,向着“顶尖程序员“迈进
10月24日,对每个程序员而言,都是一个具有特殊意义的日子。1024这个数字,不再只是计算机存储容量的基础单位,更是我们向着技术巅峰进发的象征。 回顾我的程序员之路,那是一个不断学习、不断成长的过程。起初是对编程充…...
Arcgis 数据操作
在进行数据操作的时候,需要注意坐标系要一致,这是前提。 数据类型 文件地理数据库:gbd 个人地理数据库:mdb (Mircosoft Access) 矢量数据:shp 推荐使用gbd数据,效率会更高。 采…...
YoloV7改进策略:SwiftFormer,全网首发,独家改进的高效加性注意力用于实时移动视觉应用的模型,重构YoloV7
文章目录 摘要论文:《SwiftFormer:基于Transformer的高效加性注意力用于实时移动视觉应用的模型》1、简介2、相关研究3、方法3.1、注意力模块概述3.2、高效的加性注意力3.3、SwiftFormer 架构4、实验4.1、实现细节4.2、基线比较4.3、图像分类4.4、目标检测和实例分割4.5、语义…...
Day07 Stream流递归Map集合Collections可变参数
Stream 也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。 Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作 public class Demo1 {public stati…...
8.JavaScript-注释
题记 javascript注释 单行注释 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>实例</title> </head> <body><h1 id"myH1"></h1> <p id"myP"></p>…...
知识分享|分段函数线性化及matlab测试
目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…...
ant target的depends属性
ant的target使用depends属性指明对其它target的依赖。可以依赖多个target,被依赖的多个target之间用逗号分隔。 ant会确保被依赖的target首先执行,然后再执行本target。 ant尽量按照depends属性中指明的target出现的顺序来执行(从左到右&…...
【三维重建】DreamGaussian:高斯splatting的单视图3D内容生成(原理+代码)
文章目录 摘要一、前言二、相关工作2.1 3D表示2.2 Text-to-3D2.3 Image-to-3D 三、本文方法3.1生成式 高斯 splitting3.2 高效的 mesh 提取3.3 UV空间的纹理优化 四. 实验4.1实施细节4.2 定性比较4.3 定量比较4.4 消融实验 总结(特点、局限性) 五、安装与…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
