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

设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景
设计模式之-适配器模式,快速掌握适配器模式,通俗易懂的讲解适配器模式以及它的使用场景


文章目录

  • 系列文章目录
  • 一、快速理解装饰模式
  • 二、装饰模式使用场景
  • 代码示例


一、快速理解装饰模式

装饰模式是一种结构型设计模式,它允许动态地将新功能添加到对象上,同时又不改变其结构。装饰模式通过创建一个包装对象来包裹原始对象,然后在包装对象中添加新的行为或功能。

在现实生活中,装饰模式的例子可以是穿衣服。一个人(原始对象)可以穿不同的衣服(装饰对象)来增加新的功能或美化外观,但人的本质并没有改变。

二、装饰模式使用场景

  1. 当需要在不修改现有对象的情况下,动态地添加功能时,可以使用装饰模式。装饰模式允许通过包装对象来扩展原始对象的功能,而不是通过子类继承。
  2. 当需要为多个独立的对象添加相同或类似的功能时,可以使用装饰模式。装饰模式可以避免创建大量的子类来实现不同组合的功能。

代码示例

下面是一个通俗易懂的装饰模式示例代码,以咖啡和调料为场景:

// 抽象组件:咖啡
interface Coffee {double getCost();String getDescription();
}// 具体组件:浓缩咖啡
class Espresso implements Coffee {@Overridepublic double getCost() {return 1.0;}@Overridepublic String getDescription() {return "Espresso";}
}// 抽象装饰器:调料
abstract class CoffeeDecorator implements Coffee {protected Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic double getCost() {return coffee.getCost();}@Overridepublic String getDescription() {return coffee.getDescription();}
}// 具体装饰器:牛奶
class Milk extends CoffeeDecorator {public Milk(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.5;}@Overridepublic String getDescription() {return super.getDescription() + " + Milk";}
}// 具体装饰器:糖
class Sugar extends CoffeeDecorator {public Sugar(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.3;}@Overridepublic String getDescription() {return super.getDescription() + " + Sugar";}
}// 客户端代码
public class Main {public static void main(String[] args) {Coffee espresso = new Espresso();Coffee milkCoffee = new Milk(espresso);Coffee sugarMilkCoffee = new Sugar(milkCoffee);System.out.println("Cost: " + sugarMilkCoffee.getCost());System.out.println("Description: " + sugarMilkCoffee.getDescription());}
}

在上面的示例中,Coffee是抽象组件,定义了咖啡的方法。Espresso是具体组件,实现了咖啡的方法。

CoffeeDecorator是抽象装饰器,实现了咖啡的方法,并包含一个咖啡对象的引用。Milk和Sugar是具体装饰器,分别继承了抽象装饰器,并在其中扩展了咖啡的功能。

在客户端代码中,首先创建了一个浓缩咖啡对象espresso,然后用Milk装饰了该咖啡对象,再用Sugar装饰了装饰后的咖啡对象。最后,通过调用装饰后的咖啡对象的方法,获取咖啡的费用和描述。

通过使用装饰模式,可以动态地添加功能或修改对象的行为,同时又不改变其结构。装饰模式可以避免使用子类继承的方式来实现不同组合的功能,使代码更加灵活和可扩展。

相关文章:

设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...

计算机网络个人小结

不同层的数据报的名称 应用层: data TCP层: segment IP 层: packet MAC层: frame MTU vs MSS: MTU:一个网络包的最大长度,以太网中一般为 1500 字节。 https://www.xiaolincoding.com/network/1_base/how_os_deal_network_package.html#linux-%E7%BD%91…...

酒店网站搭建的作用是什么

线上已经成为各行业商家增长破局的必要手段,传统酒店行业因信息扩展度不够,导致品牌难以传播、无法实现用户对酒店所有信息全面知悉,也无法实现在线预约及其它赋能用户消费的路径。 面对获客转化难题,很多酒店商家通过建立自营商…...

俄罗斯联邦税务局遭乌克兰入侵,数据库和副本被清空,政府数据安全不容忽视

俄罗斯联邦税务局遭乌克兰入侵,数据库和副本被清空,政府数据安全不容忽视 据相关报道,2023年12月12日,乌克兰国防情报局(GUR)称其成功入侵了俄罗斯联邦税务局(FNS)系统,并清除了该机构的数据库和…...

WPF组合控件TreeView+DataGrid之TreeView封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...

redisson 哨兵模式配置

背景&#xff1a;项目redis由集群改为哨兵模式&#xff0c;漏洞扫描未授权访问漏洞&#xff08;CNVD-2019-21763&#xff09;&#xff0c;要求对redis哨兵也设置密码&#xff0c;redisson依赖版本为3.11.5 spring-boot版本为2.1.13。 redisson依赖升级 <dependency>&l…...

免费的ChatGPT分享

免费的ChatGPT 以下是一些免费的ChatGPT平台和工具&#xff1a; 零声教学AI助手 零声教育内部使用的ChatGPT&#xff0c;提供智能对话和问题解答功能。 Ora.ai 一个可以自定义的AI聊天机器人&#xff0c;可以根据个人需求进行定制和训练。 ChatGPT 人工智能聊天机器人&a…...

C语言—每日选择题—Day54

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 存在int类型变量x&#xff0c;y&#xff0c;z&#xff0c;其对应值为x0x59&#xff0c;y0x39&#xff0c;z0x6E&#xff0c;则x * y z的值…...

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下&#xff0c;制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势&#xff0c;传统工业化理论需要进行修正和创新。其中&#xff0c;对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…...

【密码学引论】密码协议

定义&#xff1a;两个或者两个以上参与者为了完成某一特定任务而采取的一系列执行步骤密码协议&#xff1a;Kerberos、IPSec、SSL、SET算法是低层次上的概念&#xff0c;而协议是高层次上的概念&#xff0c;协议建立在算法的基础上。所有密码协议都容易受中间人攻击&#xff0c…...

利用快手的用户数据和精准营销提升电商平台用户转化率和销售额

一、快手用户数据的价值 快手作为国内领先的短视频平台&#xff0c;拥有庞大的用户群体和丰富的用户行为数据。这些数据包括用户的观看习惯、互动行为、兴趣偏好等&#xff0c;对于电商平台来说具有极高的商业价值。通过分析这些数据&#xff0c;电商平台可以深入了解用户需求…...

Linux根目录下默认目录作用

在Linux操作系统中&#xff0c;根目录&#xff08;/&#xff09;下的默认目录一般用于不同用途的文件存放和系统管理。以下是一些常见的默认目录及其用途&#xff1a; /bin&#xff1a;该目录存放系统的基本命令和可执行文件&#xff0c;如ls、cp、mv等。这些命令可供系统用户…...

国产Type-C接口逻辑协议芯片:Type-C显示器芯片方案

产品介绍 双Type-C盲插选型&#xff1a; LDR6282 PD3.0认证协议芯片&#xff0c;USB-IF TID号&#xff1a;212 支持iic&#xff0c;USB转UART&#xff0c;CC升级方式&#xff0c;多年市场验证&#xff0c;显示器市场出货量&#xff0c;显示器大厂采用兼容性NO.1。采用QFN32 5*…...

uniapp如何原生app-云打包

首先第一步&#xff0c;需要大家在HBuilder X中找到一个项目&#xff0c;然后呢在找到上面的发行选项 发行->原生App-云打包 选择完该选中的直接大包就ok。 大包完毕后呢&#xff0c;会出现一个apk包&#xff0c;这是后将这个包拖动发给随便一个人就行了。 然后接收到的那…...

分布式编译distcc

工程代码编译速度太慢&#xff0c;决定采用分布式编译来提高编译速度. distcc &#xff0c;请参考https://www.distcc.org/ 安装 我用的distcc的版本是distcc-3.2rc1, 下载源码&#xff0c;安装步骤如下&#xff1a; ./autogen.sh ./configure --disable-Werror --prefix/…...

Elasticsearch常见面试题

文章目录 1.简单介绍下ES&#xff1f;2.简单介绍当前可以下载的ES稳定版本&#xff1f;3.安装ES前需要安装哪种软件&#xff1f;4.请介绍启动ES服务的步骤&#xff1f;5.ES中的倒排索引是什么&#xff1f;6. ES是如何实现master选举的&#xff1f;7. 如何解决ES集群的脑裂问题8…...

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…...

【智能家电】东胜物联离在线语音方案为厨电企业赋能,实现厨房智能化控制

近年来&#xff0c;我国厨电市场蓬勃发展。据行业统计数据显示&#xff0c;至今年6月&#xff0c;市场规模已达356亿元&#xff0c;同比增长8.8%。随着数字科技、物联网和人工智能的兴起&#xff0c;厨电产品正在朝着更智能、多功能化的方向迅速发展。 为此厨电厂商正在积极布…...

3DMAX英文版怎么切换到中文版?

3DMAX英文换到中文版的方法 3dMax是专业三维建模、渲染和动画软件&#xff0c;它使你能够创建广阔的真实世界和各种高级设计。 -使用强大的建模工具为环境和景观注入活力。 -使用直观的纹理和着色工具创建精细的细节设计和道具。 -迭代并制作具有完全艺术控制的专业级渲染图…...

WEB渗透—PHP反序列化(八)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…...

开源命令中心OpenClaw:统一管理与编排自动化任务工作流

1. 项目概述&#xff1a;一个开源命令中心的诞生最近在折腾一个很有意思的项目&#xff0c;叫openclaw-command-center。光看这个名字&#xff0c;你可能会联想到科幻电影里的控制台&#xff0c;或者某种自动化运维工具。没错&#xff0c;它的核心定位就是一个开源、可扩展的命…...

BilibiliDown终极指南:免费跨平台B站视频下载器完整教程

BilibiliDown终极指南&#xff1a;免费跨平台B站视频下载器完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors…...

Luma 视频生成 API 集成指南

随着人工智能的广泛应用&#xff0c;AI 程序逐渐在各个领域流行开来。从最初的写作、医疗教育&#xff0c;到如今的视频生成&#xff0c;AI 正在渗透人们工作和生活的方方面面。 Luma 是一个专业的高质量视频生成平台&#xff0c;用户只需上传素材&#xff0c;便可以根据不同的…...

1.QT和MySQL的连接

以下是图片中的完整文本提取&#xff1a;流程&#xff1a; 1、安装Qt 2、配置path环境变量 3、编译mysql驱动 (用Qt打开mysql.pro文件) 第6行左右&#xff0c;在QMAKE_USE mysql前面加上#&#xff0c;变为 #QMAKE_USE mysql win32:LIBS -LD:/mysql/mysql-8.0.19-winx64/lib …...

开发者技能编织:从点状学习到系统构建的成长框架

1. 项目概述&#xff1a;编织你的开发者技能树“plaited/development-skills”这个项目标题&#xff0c;乍一看可能有点抽象&#xff0c;但如果你把它拆开&#xff0c;就能立刻明白它的核心价值。“Plaited”是“编织”的意思&#xff0c;而“development-skills”直译就是“开…...

书匠策AI到底是什么黑科技?论文小白看完直接开挂 | 2025毕业论文生存指南

文/论文写作科普君 如果你现在正对着空白的Word文档发呆&#xff0c;光标闪了半小时一个字没打出来——恭喜你&#xff0c;这篇科普就是为你量身定做的。 今天要聊的这个东西叫书匠策AI&#xff0c;官网地址是 官网直达&#xff1a;www.shujiangce.com&#xff0c;微信搜一搜&…...

Java基础全套教程(十)—— 反射机制详解

Java基础全套教程&#xff08;十&#xff09;—— 反射机制详解 前言 反射是Java语言极具特色的核心特性&#xff0c;也是Java实现动态编程的基石。日常开发中使用的Spring框架、MyBatis框架、JUnit单元测试、动态代理等核心功能&#xff0c;底层全部依赖反射机制实现。 普通Ja…...

5分钟掌握ModTheSpire:零风险解锁《杀戮尖塔》无限可能

5分钟掌握ModTheSpire&#xff1a;零风险解锁《杀戮尖塔》无限可能 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 还在为《杀戮尖塔》的原版内容感到厌倦&#xff1f;想要体验全新的角…...

【RT-DETR实战】029、注意力机制改进:Transformer Encoder增强实战笔记

一、从一次深夜调试说起 上周三凌晨两点,产线视觉检测突然报错——产线上快速移动的小尺寸元件开始漏检。排查发现,当目标尺寸小于3232像素时,RT-DETR的检测置信度会从0.8骤降到0.3以下。 打开热力图可视化,发现Encoder层对微小目标的注意力响应几乎散成了噪声。 问题定…...

响应式编程-Flux 背压机制与操作符链式调用源码剖析

1. Flux背压机制的核心原理 背压&#xff08;Backpressure&#xff09;是响应式编程中最重要的流量控制机制之一。想象一下自来水管和水龙头的关系&#xff1a;当水龙头开得太大而下水道排水速度跟不上时&#xff0c;水槽就会溢出。Flux的背压机制就像这个系统中的智能调节阀&…...