【重温设计模式】装饰模式及其Java示例

装饰模式的介绍

在众多设计模式中,有一种叫做装饰模式,它以一种独特的方式赋予了代码更多的灵活性。

装饰模式是一种结构型设计模式,它允许我们在运行时动态地为对象添加新的行为。这就像是我们在装饰一个房间时,可以随意添加或更换装饰品,而不需要对整个房间进行改造。装饰模式的特点是,它可以保持代码的清晰和简洁,同时提供了强大的扩展性。这种模式在很多场景中都有应用,比如在Java的IO流中,我们就可以看到装饰模式的影子。

public class OneMore {
    public void doSomething() {
        System.out.println("Do something in OneMore class");
    }
}

public class Decorator extends OneMore {

    @Override
    public void doSomething() {
        super.doSomething();
        oneMore.doSomething();
    }
}

在上面的Java代码示例中,我们定义了一个基类OneMore和一个装饰器类Decorator。装饰器类Decorator继承了OneMore类,并重写了doSomething方法,在方法中调用了OneMore类的doSomething方法。这样,我们就可以动态地为OneMore类添加新的行为,而不需要修改OneMore类的代码。

这只是装饰模式的一种简单应用,接下来我们将深入探讨装饰模式背后的设计原则。

装饰模式的设计原则

在理解了装饰模式的基本概念后,我们来深入探讨装饰模式背后的设计原则。装饰模式是一种结构型设计模式,其主要目标是通过动态添加或覆盖方法,来扩展一个对象的功能。这种模式的设计理念,恰恰体现了两个重要的设计原则:开闭原则和单一职责原则。

首先,装饰模式实现了开闭原则。这个原则的核心思想是“对扩展开放,对修改关闭”。在装饰模式中,如果我们需要增加新的功能,只需要添加一个新的装饰类即可,无需修改原有的代码。这就避免了因修改代码而引发的可能的错误或者对原有功能的影响。例如,假设我们有一个Java类OneMore,现在我们想给它添加一个新的功能,我们可以创建一个装饰类,如下:

public class Decorator extends OneMore {
    @Override
    public void function() {
        super.function();
        addedFunction();
    }

    public void addedFunction() {
        // New function
    }
}

这样,我们就在不修改OneMore类的情况下,给它添加了新的功能。

其次,装饰模式实现了单一职责原则。这个原则要求一个类应该只有一个引起它变化的原因。在装饰模式中,每个装饰类都只负责一个功能的添加,这样就避免了一个类承担过多的责任,使得代码更加清晰和可维护。

通过以上的讨论,我们可以看出装饰模式的设计理念是非常符合软件开发中的设计原则的。接下来,我们将通过一个具体的Java实例,来展示如何在Java中实现装饰模式。

Java中的装饰模式实例

在理解了装饰模式的设计原则后,让我们通过一个具体的Java程序示例来展示如何在Java中实现装饰模式。这里我们将设计一个简单的“书籍”类,这个类有一个“阅读”方法。然后,我们将创建一个名为“OneMore”的装饰类,它将增强“书籍”类的“阅读”方法,使其在阅读书籍的同时,还能进行一些其他的功能,如记笔记。

首先,让我们定义一个简单的“书籍”类:

public class Book {
    public void read() {
        System.out.println("Reading a book...");
    }
}

然后,我们创建一个名为“OneMoreBook”的装饰类,它也有一个“阅读”方法。在这个方法中,我们首先调用了原始的“阅读”方法,然后增加了一些新的功能:

public class OneMoreBook extends Book {
    public void read() {
        super.read();
        System.out.println("And taking notes...");
    }
}

在上述代码中,我们首先创建了一个新的“OneMoreBook”类,它继承了“Book ”类,并在其内部定义了一个“read”方法。在“OneMoreBook”类的“read”方法中,首先调用了原始“Book ”类的“阅读”方法,然后增加了一些新的功能。

这就是一个简单的装饰模式的实例,通过这个实例,我们可以看到,装饰模式可以在不改变原始类的基础上,动态地扩展其功能。当然,这只是装饰模式的一种应用,它的优缺点及适用场景还有很多,接下来我们将进一步探讨这个话题。

装饰模式的优缺点及适用场景

在上面的例子中,我们可以看到装饰模式的一大优点:它提供了一种非常灵活的方式来扩展对象的功能,而不需要修改原有对象的代码。这是因为装饰模式是在运行时动态地将新功能添加到对象上,而不是在编译时。这使得我们可以在不影响其他对象的情况下,为特定的对象添加新的功能。

然而,装饰模式并不是万能的。它的一个主要缺点是会导致设计中出现大量的小对象。如果过度使用装饰模式,可能会使程序变得复杂,难以理解和维护。

至于装饰模式的适用场景,通常来说,当我们需要给一个对象动态添加功能,或者给一组对象添加相同的功能时,装饰模式都是一个不错的选择。例如,在Java的IO流中,就广泛使用了装饰模式,使得我们可以灵活地为一个流添加各种各样的处理功能,如缓冲、压缩和字符编码转换等。

总的来说,装饰模式是一种非常有用的设计模式,它能够提供一种简洁、灵活的方式来扩展对象的功能。但是,正如我们所讨论的,它也有其缺点和限制。因此,在实际开发中,我们需要根据具体的需求和场景,灵活地选择和使用装饰模式。

总结

装饰模式,这个看似简单却又深奥的设计模式,希望在我的介绍下,你能有所理解和掌握。这种模式,就像一个装饰师,给我们的代码添加了更多的灵活性和可扩展性,让我们的代码更加美观和实用。

但是,正如我所说的,装饰模式并不是万能的,它也有其局限性,可能会导致程序设计中出现大量的小对象,增加了程序的复杂性。因此,我们在使用时,需要根据具体的需求和场景,灵活地选择和使用装饰模式。

在编程的世界里,没有最好的设计模式,只有最适合的设计模式。每一种设计模式都有其独特的优点和适用场景,我们需要做的,就是去理解它,掌握它,然后在合适的地方,合适的时机,使用它。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么?

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么? 首先,需要确认Docker是否已经安装。如果未安装,则需要进行安装。接下来,运行Docker容器。这一步是为了创建一个可以运行幻兽帕鲁服务端的环境。然后,在容器…

bootstrap-table 多层组合表头

如下图所示的二层组合表头 来人,上代码! table.bootstrapTable({url: $.fn.bootstrapTable.defaults.extend.index_url,pk: id,sortName: id,search: false,showToggle: false,showColumns: false,showExport: false, commonSearch: false,columns: [[…

ElasticSearch之分布式模型介绍,选主,脑裂

写在前面 本文看下es分布式模型相关内容。 1:分布式模型 1.1:分布式特征 支持水平扩展,可以存储PB级别数据,每个就能都有自己唯一的名称,默认名称时elasticsearch,可以通过配置文件,如cluster.name: my…

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub:https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录,可以长久保存你的数据加入现有群组或者创建自己的群组,来和大家交流和任意人私聊,并添…

Cascading risk assessment in power-communication interdependent networks论文导读

Cascading risk assessment in power-communication interdependent networks 前言碎碎念 新学期了,兜兜转转绕了一圈,看了两篇交通流预测的内容,不过我的主要研究方向不在于此。最近和一些老师沟通交流,感觉思路稍微清晰了一些…

雷龙CS SD NAND(贴片式TF卡)测评体验

前段时间有幸免费得到了雷龙出品的贴片式的TF卡的芯片及转接板,两片贴片式nand芯片+一个转接板,一种一个已让官方焊接完好;如下图所示: 正面: 背面: 通过转接板,可以将CS SD NAND(贴…

好视通视频会议系统存在任意文件读取漏洞复现 [附POC]

漏洞简介 好视通视频会议是由深圳市华视瑞通信息技术有限公司开发,其在国内率先推出了3G互联网视频会议,并成功应用于SAAS领域。 资产 FOFA:app"好视通-视频会议" POC GET /register/toDownload.do?fileName../../../../../../../../../.…

NSGA II 算法讲解(毕业设计)(三)

目录 前言 1、NSGA II算法介绍 2、Pareto最优概念 2.1 Pareto最优,Pareto前延 2.2 支配关系 3、NSCA-II与NSCA相比,优势 4、NSGA II流程逻辑 5、拥挤度排序 6、新子代生成 前言 本篇文章介绍的是我的毕业设计,我将C语言将其实现。本…

深入理解volatile关键字

一、简介 volatile是 Java提供的一种轻量级的同步机制。Java包含两种内在的同步机制:同步块(或方法)和 volatile 变量相比于synchronized (synchronized常称为重量级)volatile是更轻量级的,因为它不会引起线程上下文的…

LeetCode25: K 个一组翻转链表

题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…

B树系列(详解)

目录 一、B-树 二、B树 三、B*树 四、时间复杂度 五、Mysql与B树系列 一、B-树 首先再说B树的性质以及其他的之前,先要说一声,好多人都把这个树叫B减树,其实不是,他就叫B树,至于原因我觉的没必要再这个名字上纠结…

HTTPS证书怎么申请?多少钱?

HTTPS证书的申请费用会因多种因素而异,主要包括以下几点: 1. 证书类型: - 域名验证型证书(DV SSL):这种证书仅验证域名的所有权,申请速度较快,通常用于个人网站或小型项目,价格相对较低&…

Java对象大小计算

概述 在实际应用中,尤其是在进行JVM调优时,理解并正确估计对象大小是非常重要的,因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。 对象的组成 在Java中,计算一个对象的大小是为了了解它在内存中占用的确切空间…

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序,vue不熟练,自己练手项目,就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…

【机器学习:推荐系统】什么是推荐系统?

【机器学习:推荐系统】什么是推荐系统? 推荐系统如何工作?推荐系统生命周期推荐系统算法使用推荐系统的好处推荐系统的类型协同过滤基于内容的过滤混合过滤 现实生活中的推荐系统示例亚马逊Spotify脸书/元数据Netflix谷歌和 YouTube 关于推荐…

BUUCTF---另外一个世界1

1.这是一道杂项题,也是我觉得最值得记录的一道题。 2.话不多说,题目描述(真的是另一个世界) 3.下载附件,是一张图片 4.尝试了查看属性,以及在记事本中打开看看有没有什么有用的信息,发现没什么…

基于单片机的节能窗控制系统设计

摘 要:本文以单片机为基础,对节能窗控制系统进行了科学设计,在满足日常生活需求的同时更好地实现节能减排目标。此设计中的节能窗控制系统,实际操作要灵活,具备可靠且稳定的性能,同时具备节能功效。 关键词:单片机;节能窗控制系统;系统设计 在节能窗等概念推广的背景…

Java 下载excel文件

一、背景 微信小程序需要导出excel文件,后端技术Java,前端使用uniapp框架,使用excel模板。 二、excel 报表模板 需要补充的内容是以下标记问号的,其中有个表格,内容是动态添加的 三、Java端代码实现 关键步骤&…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求,通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求,展现了其在实验研究中的经济性、可靠性和实用性,具有良好的推广价值。 项…

【OpenCV】绘制桌面锁屏时钟

OpenCV 是一个开源的计算机视觉(Computer Vision)与机器学习软件库,提供了多种图像处理算法与接口,用于解决计算机视觉相关问题。OpenCV 支持多平台与多语言,本文主要记录如何使用 OpenCV-Python 绘制桌面锁屏时钟。 目…