java设计模式(八)装饰模式(Decorator Pattern)

1、模式介绍:

装饰模式是一种结构型设计模式,允许你通过将对象放入包含行为的特殊包装对象中来动态地扩展其功能。它提供了一种灵活的方式来添加功能,避免了创建大量子类的问题。

2、应用场景:

动态添加功能:当需要动态地给一个对象添加功能,而且这些功能可以组合的时候,装饰模式是一个很好的选择。例如,对输入流进行缓冲、加密或压缩操作。
避免子类爆炸:通过装饰模式,可以避免大量子类的创建,每个装饰器类只关注一个特定的功能,使得功能的组合更加灵活。

3、优点:

灵活性:可以动态地添加对象的功能,而不需要修改现有的代码。
避免子类爆炸:避免创建大量扩展类。
单一职责原则:每个装饰器只关注一个功能,符合单一职责原则。

4、缺点:

复杂性增加:因为装饰模式会增加许多小类和对象,可能会使设计更加复杂。
初学者理解困难:对于初学者来说,理解装饰模式可能需要一定的时间。

5、代码实现:

/*** 车品牌接口** @author FM_南风* @date 2024/7/2 13:16*/
public interface Car {void assemble();
}/*** 基础品牌车** @author FM_南风* @date 2024/7/2 13:16*/
public class BasicCar implements Car{@Overridepublic void assemble() {System.out.print("Basic Car.");}
}/*** 装饰** @author FM_南风* @date 2024/7/2 13:17*/
public class CarDecorator implements Car{protected Car decoratedCar;public CarDecorator(Car decoratedCar) {this.decoratedCar = decoratedCar;}public void assemble() {this.decoratedCar.assemble();}
}/*** 普通品牌车** @author FM_南风* @date 2024/7/2 13:17*/
public class GeneralCar extends CarDecorator{public GeneralCar(Car decoratedCar) {super(decoratedCar);}@Overridepublic void assemble() {super.assemble();System.out.print("添加一个普通品牌车");}
}/*** 奢侈品牌车** @author FM_南风* @date 2024/7/2 13:17*/
public class LuxuryCar extends CarDecorator{public LuxuryCar(Car decoratedCar) {super(decoratedCar);}@Overridepublic void assemble() {super.assemble();System.out.print("添加一个奢侈品牌车");}
}/*** 应用** @author FM_南风* @date 2024/7/2 13:19*/
public class DecoratorClient {public static void main(String[] args) {Car sportsCar = new GeneralCar(new BasicCar());sportsCar.assemble();System.out.println("");Car sportsLuxuryCar = new GeneralCar(new LuxuryCar(new BasicCar()));sportsLuxuryCar.assemble();}
}

6、结果展示:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter

第1坑:配置第三方仓库不生效, 提示在阿里云仓库没有找到 spring-ai-openai-spring-boot-starter 第2坑:升级jdk17后,springboot项目启动报错 Internal error (java.lang.reflect.InaccessibleObjectException): Unable to make pr…

基于CesiumJs的可视化大屏,效果不是一般的震撼。

CesiumJS是一个用于创建三维地理信息系统(GIS)应用程序的开源JavaScript库。它提供了强大的地理空间数据可视化和交互功能,可以用于构建虚拟地球、地图、飞行模拟等应用。 1. 三维地理空间可视化: CesiumJS支持将地理空间数据以三…

瑞芯微rk356x TF卡烧写选择指定的屏幕打印烧写的过程

rk356x中TF卡烧写屏幕选择 1、开发环境2、问题描述3、解决办法4、总结5、 图片展示1、开发环境 系统:linux系统 芯片:356x 显示:多屏显示(HDMI, MIPI, LVDS, EDP) 2、问题描述 由于在多屏显示的情况下,HDMI屏在LVDS、MIPI或者EDP协同下,默认情况下,在TF卡烧录过程中…

使用dd命令简单测试磁盘I/O

本文所有测试使用的均是Oracle公有云OCI上的计算实例的启动盘。 第1轮测试使用的是默认的启动盘参数。第2轮测试使用的是自动调整的启动盘参数(如下图),性能更高。 第1轮测试 顺序I/O 运行以下命令5次,dsync表示不使用cache&…

计算机网络-组播数据转发原理

一、组播数据转发原理 前面已经学习了组播的基本概念和网络组成结构了,今天来学习下组播数据的转发。首先我们要先明确组播网络也是和单播一样需要网络可达的,因此也是需要单播网络支持的基础上配置组播转发数据。单播网络不通组播网络就没有意义了。 组…

链表——随机链表的复制

基于这篇文章算法的改进随机链表复制 这道题的关键在于完成链表复制后,如何修改random指针。即如何通过遍历原链表找到复制链表的结点。 过去的算法是修改原链表的next,让每个复制结点位于原链表结点后面。 但是,在C的STL库中,有应…

下载安装JavaFX及解决报错:缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序|Eclipse

目录 1.下载并解压 2.Eclipse配置 3.报错问题 解决方法1:将javaSE更改到9以下 解决方法2: 使用module-info.java配置解决 1.下载并解压 JavaFX下载地址:JavaFX - Gluon 选择合适自己电脑配置的sdk版本下载 打不开网页的参考这个博客&…

智能视频监控如何助力体育场馆安全管理:安防监控EasyCVR视频综合管理方案

近期有新闻报道,6月30日,17岁的中国国家羽毛球运动员在亚洲青年羽毛球锦标赛中,突然晕倒并抽搐,尽管被送往医院抢救,该运动员仍在当晚不幸离世。运动猝死不仅发生于职业运动员身上,在普通健身者中也时有发生…

5.opencv深浅拷贝

图像处理的复制操作 深浅拷贝 图像复制分成两种,第一种假复制,从原图片选择一部分图片拿出来观察,此时新生成的图片和原图实际上是同一张图片,即浅拷贝 将图片的一部分复制下来,放到新的内存中,即两张完全…

Tell Me Why:利用大型语言模型进行可解释的公共健康事实核查

Tell Me Why: Explainable Public Health Fact-Checking with Large Language Models 论文地址:https://arxiv.org/abs/2405.09454https://arxiv.org/abs/2405.09454 1.概述 最近的COVID-19大流行突显了公共健康领域事实核查的关键需求。在信息通过社交媒体平台迅速传播的时…

SpringMVC系列十二: 异常处理

异常处理 异常处理基本介绍局部异常应用实例Debug处理流程 全局异常应用实例Debug处理流程异常处理时: 局部异常 优先级高于 全局异常 自定义异常应用实例Debug处理流程 SimpleMappingExceptionresovler基本说明应用实例对未知异常进行统一处理异常处理的优先级梳理 上一讲, 我…

用ChatGPT辅助论文写作又怕学术造假?这样用就对了!

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 随着人工智能技术的发展,ChatGPT等语言模型在学术研究中的应用日益广泛。然而,在利用这些工具时,如何避免学术造假成为一个重要问题。学术造假不仅损…

flask、fastapi在服务器制作接口携参访问返回参数

flask创建接口: 一、安装python 官网下载Download Python | Python.org 二、安装flask 在选择的文件夹路径cmd调用bash安装 pip install Flask三、创建flask应用 # app.py from flask import Flask, request, jsonify app Flask(__name__) app.route(/ech…

Linux服务管理(二)DHCP/FTP服务

DHCP四部曲是指客户机请求IP、服务器响应、客户机选择IP以及服务器确定租约四个步骤的过程。这一系列过程共同构成了DHCP客户机动态获取IP地址的完整流程。下面将详细解读这一过程的每个阶段: 客户机请求IP:也称为DHCPDISCOVER,当一个DHCP客户…

ESXi6.7 update 3主机实现新硬件运行老环境

server 2003 SQL server 2000 SQL SP4 vmware tools 一、适用场景 1、运行多年的老企业,积累的数据量庞大,其中的数据库并不一定都是现在开发的平台或系统,而是已经正在运行,不能停业务的状态。 2、老系统老应用平台&#xf…

IT数据从业人员必读好物——最新发布物开放免费下载!

如今,越来越多的企业开始重视IT在业务中的作用,并寻求通过数字化转型来提升竞争力,且趋向于采用敏捷、灵活的方法来适应快速变化的市场需求。 本月精选发布物,正是为企业的IT管理提供了一个全面的标准化框架,帮助企业系…

如何确保工业展厅设计既专业又吸引?三原则详解!

工业是民族发展的基石,它为我们带来了无数的便利和进步,而为了让更多人了解这个至关重要的产业,以及其背后的技术和产品,许多工业性质的企业都致力于通过互动投影、虚拟现实、全息投影等多媒体技术,来打造独具特色的工…

vue-virtual-scroller-展示大量数据列表-虚拟列表展示优化

安装 -演示 npm i vue-virtual-scrolleryarn add vue-virtual-scrollervue-virtual-scroller 是一个 Vue 组件库,用于高效地渲染大量数据项,通过虚拟滚动来提升性能。它适用于长列表、网格、表格等场景 引入组件 Vue 项目中引入并注册 vue-virtual-scroller 组件。你可以在全…

@金融安全专业人士和风险管理决策者,必读白皮书现开放免费下载!

加快建设金融强国,是中国经济长远发展的战略抉择,更是在经济全球化进程中维护国际金融安全的重要举措,而防控金融风险是建设金融强国的重要保障。 本月最新发布物,聚焦「安全」主题,尤其为金融行业的安全专家&#xff…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…