金三银四面试题(二十三):装饰器模式知多少?

什么是装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向对象添加新的行为,而无需修改原始对象的结构。通过将对象包装在一个或多个装饰器对象中,装饰器模式可以增强原始对象的功能。

装饰器组件

  1. Component(组件):这是被装饰的对象的接口或抽象类。它定义了对象的行为。

  2. ConcreteComponent(具体组件):这是实现了 Component 接口的具体类。它表示要被装饰的原始对象。

  3. Decorator(装饰器):这是一个抽象类或接口,继承自 Component。它包含对 Component 对象的引用,并为原始对象提供额外的行为。

  4. ConcreteDecorator(具体装饰器):这是实现了 Decorator 的具体类。它对原始对象的行为进行增强,并在必要时调用被装饰对象的方法。

优点

  • 灵活性和可扩展性:可以在运行时动态地添加或删除装饰器,以增强对象的功能。
  • 代码复用:装饰器可以重复使用,以增加不同对象的功能。
  • 遵循开放-封闭原则:通过添加装饰器来扩展对象的行为,而不修改原始对象的结构。

举个例子

依旧是使用我们之前的咖啡的例子

// Component接口
interface Coffee {double cost();String description();
}// ConcreteComponent
class BasicCoffee implements Coffee {public double cost() {return 2.0; // 基础咖啡的价格}public String description() {return "Basic Coffee"; // 基础咖啡的描述}
}// Decorator抽象类
abstract class CoffeeDecorator implements Coffee {protected Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}
}// ConcreteDecorator
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}public double cost() {return coffee.cost() + 0.5; // 添加牛奶的价格}public String description() {return coffee.description() + ", Milk"; // 添加牛奶的描述}
}class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}public double cost() {return coffee.cost() + 0.2; // 添加糖的价格}public String description() {return coffee.description() + ", Sugar"; // 添加糖的描述}
}// 使用装饰器模式
public class Main {public static void main(String[] args) {// 创建一个基础咖啡Coffee coffee = new BasicCoffee();// 添加牛奶装饰器coffee = new MilkDecorator(coffee);// 再次添加糖装饰器coffee = new SugarDecorator(coffee);// 输出咖啡的描述和价格System.out.println("Description: " + coffee.description());System.out.println("Cost: " + coffee.cost());}
}

我们创建了一个基础咖啡对象 BasicCoffee,然后动态地向它添加装饰器 MilkDecoratorSugarDecorator。这些装饰器增强了原始对象的功能,提供了灵活性和可扩展性。这像不像一个Class级别的建造者模式。

思考

都是对功能进行增强,那么代理模式和装饰器模式有什么区别呢?

往期推荐

金三银四面试题(二十一):代理模式知多少?2024-04-16
金三银四面试题(二十):单例模式知多少?2024-04-15
金三银四面试题(十九):MySQL中的锁2024-04-09
MySQL基础练习题:习题7-112024-04-09
金三银四面试题(十八):MySQL索引2024-04-08
MySQL基础练习题:习题4562024-04-08
金三银四面试题(十七):MySQL面试都问什么(2)2024-04-07
MySQL基础练习题:习题2-32024-04-07
MySQL基础练习题:创建数据库2024-04-07
金三银四面试题(十六):MySQL面试都问什么(1)2024-04-07

在这里插入图片描述

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

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

相关文章

最详细的SSL证书说明及免费申请方法

JoySSL官网 注册码230918 SSL(Secure Sockets Layer)证书,现在通常指的是其继任者TLS(Transport Layer Security)证书,是确保数据传输安全的核心技术之一。本文将深入探讨SSL证书的工作原理、重要性、类型以…

闪存存储和制造技术概述

闪存存储技术 引言 性能由高到低排序:SLC -> MLC -> TLC -> QLC 根据这个排序读写速度也越来越低,价格越来越便宜 1. SLC SLC(Single-Level Cell,单层单元): SLC 闪存具有最高的性能、耐用性和可…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

值得推荐的文档透明加密软件TOP3

文档透明加密软件是一种可以对文档进行加密处理&#xff0c;同时保持文档的可读性和可编辑性的软件。通常&#xff0c;这种软件会在用户对文档进行保存或传输时自动对文档进行加密&#xff0c;而在用户需要访问文档时则会解密文档&#xff0c;以便用户正常地查看和编辑文档内容…

2024年【氧化工艺】最新解析及氧化工艺复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺最新解析是安全生产模拟考试一点通总题库中生成的一套氧化工艺复审模拟考试&#xff0c;安全生产模拟考试一点通上氧化工艺作业手机同步练习。2024年【氧化工艺】最新解析及氧化工艺复审模拟考试 1、【单选题…

第一章 引论

我是一个普普通通的学渣&#xff0c;2021年参加了PMP考试&#xff0c;获取了5A的成绩。 秘诀是多做题&#xff0c;题中不会的问题从书中找到答案。 下面整理了一下PMP知识体系&#xff0c;希望可以提供参考~ 1.1指南的概述和目的 •普遍认可 这些知识和做法在大多数时候适用…

Gone框架介绍3 - 使用gone命令,自动生成Priest函数

文章目录 1. 安装辅助工具: gone2. 创建一个名为gen-code的新项目3. 创建Goner4. 使用辅助工具5. 添加main函数 我在两年前实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff0c;自己觉得还挺好用的&#xff1b;之前一直…

Java8 Stream常见用法

Stream流的常见用法&#xff1a; 1.利用stream流特性把数组转list集合 //定义一个数组Integer[] array {5,2,1,6,4,3};//通过stream特性把数组转list集合List<Integer> list Arrays.stream(array).collect(Collectors.toList());//打印结果System.out.println(list);…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写&#xff0c;所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说&#xff0c;将同一业务的数据先分片&#xff0c;再以多份副本的形…

31.基础乐理-首调与固定调

首调与固定调的概念&#xff1a; 首调 与 固定调 这两个词都是针对 唱名 来说的&#xff0c;针对唱名1234567 来说的&#xff0c;和别的没什么关系&#xff0c;这两个概念是唱名的两种不同表达方式 首调&#xff1a;虽然各个大调实际使用的按键、使用的音名都是不一样的&#x…

OFDM802.11a的FPGA实现(五)卷积编码器的FPGA实现与验证(含verilog代码和matlab代码)

目录 1.前言2.卷积编码2.1卷积编码基本概念2.2 802.11a卷积编码器2.3 卷积编码模块设计2.4 Matlab设计与ModelSim仿真验证 1.前言 前面一节完成了扰码器的FPGA设计与Matlab验证&#xff0c;这节继续对卷积编码器进行实现和验证。 2.卷积编码 2.1卷积编码基本概念 卷积码编码器…

Zotero导入参考文献详细步骤

步骤一&#xff1a; 下载Zotero 步骤二&#xff1a;安装浏览器插件 下载安装Zotero Connector插件 步骤三&#xff1a;将需要的文献导入Zotero 1、在谷歌学术或者知网等搜索需要的文献 2、点击文章标题进入详情&#xff0c;在安装好Zotero插件后&#xff0c;同时保持Zotero打…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件&#xff0c;你是否也曾感到手足无措、焦头烂额&#xff1f;现在&#xff0c;有了我们的批量文件管理工具&#xff0c;PDF文件的管理将变得前所未有的高效与简单&#xff01; 首先&#xff0c;我们要…

足球滚球数据分析靠谱吗?能不能通过大模型去实时预测?

足球滚球数据分析在一定程度上是靠谱的&#xff0c;但并非绝对可靠。滚球数据分析主要依赖于大量的历史数据、实时比赛数据以及相关的统计模型来预测比赛结果。这些数据可以包括球队的实力对比、球员状态、比赛进程、进球趋势、控球率变化等多个方面。 通过深入分析和挖掘这些数…

java 运行时数据区

java运行时数据区域 Java 运行时数据区域是 Java 虚拟机 (JVM) 在运行 Java 程序时所使用的内存空间的抽象表示。它主要包括以下几个区域&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 程序计数器是一块较小的内存空间&#xff0c;是…

xLua背包实践

准备工作 环境&#xff0c;代码 在C#代码方面我们需要准备单例模式基类&#xff0c;AB包管理器&#xff0c;lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包&#xff0c;具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码&#xff1a; JsonUtil…