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

二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统


在现代软件开发中,通知系统是一个广泛应用的功能,用于实时向用户发送各种类型的通知,如短信、微信、邮件以及系统通知。然而,通知系统的需求通常是多变且动态的,因此需要一种灵活可扩展的设计模式来满足不同类型的通知需求。


在前面一篇文章中,我们介绍了什么是装饰器模式?以及装饰器模式的适用场景和技术点,并以简单的案例进行了说明,感兴趣的朋友请前往查看。


相信阅读了上一篇文章的朋友,就知道,装饰器模式即可完全满足上述的通知需求。


那么今天我们就介绍如何利用装饰器模式来构建一个高度可定制的通知系统,实现通知的动态组合和扩展。


一、关键技术点回顾

装饰器模式是一种结构型设计模式,允许在不改变现有对象结构的情况下,动态地添加功能。

在通知系统中,我们可以将各种通知类型(短信、微信、邮件、系统通知)视为组件,而装饰器则用于为这些组件添加额外的通知功能。


二、实现案例代码

下面是一个简化的通知系统的装饰器模式实现的示例代码:

// 抽象构件 - 通知接口
interface Notification {void send(String message);
}// 具体构件 - 短信通知
class SMSNotification implements Notification {@Overridepublic void send(String message) {System.out.println("发送短信通知:" + message);}
}// 具体构件 - 微信通知
class WeChatNotification implements Notification {@Overridepublic void send(String message) {System.out.println("发送微信通知:" + message);}
}// 具体构件 - 邮件通知
class EmailNotification implements Notification {@Overridepublic void send(String message) {System.out.println("发送邮件通知:" + message);}
}// 具体构件 - 系统通知
class SystemNotification implements Notification {@Overridepublic void send(String message) {System.out.println("发送系统通知:" + message);}
}// 装饰器 - 抽象装饰器类
abstract class NotificationDecorator implements Notification {protected Notification notification;public NotificationDecorator(Notification notification) {this.notification = notification;}@Overridepublic void send(String message) {notification.send(message);}
}// 具体装饰器 - 短信通知装饰器
class SMSNotificationDecorator extends NotificationDecorator {public SMSNotificationDecorator(Notification notification) {super(notification);}@Overridepublic void send(String message) {super.send(message);sendSMS(message);}private void sendSMS(String message) {System.out.println("额外发送短信通知:" + message);}
}// 具体装饰器 - 微信通知装饰器
class WeChatNotificationDecorator extends NotificationDecorator {public WeChatNotificationDecorator(Notification notification) {super(notification);}@Overridepublic void send(String message) {super.send(message);sendWeChat(message);}private void sendWeChat(String message) {System.out.println("额外发送微信通知:" + message);}
}

以下是客户端代码:

public class Client {public static void main(String[] args) {// 创建基础通知对象Notification notification = new SystemNotification();// 使用装饰器动态添加短信通知和微信通知notification = new SMSNotificationDecorator(notification);notification = new WeChatNotificationDecorator(notification);// 发送通知notification.send("您有新的消息,请注意查收!");// 输出:// 发送系统通知:您有新的消息,请注意查收!// 额外发送短信通知:您有新的消息,请注意查收!// 额外发送微信通知:您有新的消息,请注意查收!}
}

在以上代码中,我们首先创建了一个基础的通知对象,即SystemNotification

然后,通过装饰器模式,我们动态地为该通知对象添加了短信通知和微信通知功能,分别使用SMSNotificationDecoratorWeChatNotificationDecorator进行装饰。

最后,我们调用send方法发送通知,触发通知的发送。


三、总结

装饰器模式为通知系统提供了一种灵活可扩展的设计方案,使得我们能够动态地组合不同类型的通知并添加额外的功能,而无需修改现有代码。通过使用装饰器模式,我们可以轻松地扩展通知系统以满足不断变化的需求。


然而,装饰器模式并不仅限于通知系统。它在许多其他领域也有广泛的应用,如图形用户界面(GUI)的设计、输入输出流的处理等。通过理解装饰器模式的核心思想和实现方式,我们可以在实际的软件开发中更好地应用它,提高代码的灵活性和可维护性。


值得注意的是,装饰器模式还有许多其他的扩展和变体形式,例如使用透明装饰器、使用多个装饰器链等。这些扩展和变体可以根据具体需求进行选择和应用。


下一篇博文中,我们将继续研究更多设计模式,为您揭示更多的技巧和技术,敬请期待~


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


相关文章:

二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统

在现代软件开发中,通知系统是一个广泛应用的功能,用于实时向用户发送各种类型的通知,如短信、微信、邮件以及系统通知。然而,通知系统的需求通常是多变且动态的,因此需要一种灵活可扩展的设计模式来满足不同类型的通知…...

使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令

背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情。 解决方案 定制化一键 ESLint,执行文件下载地址: https://github.com/mazeyqian/go-g…...

C++ static与类

C static与类 1. 不和对象直接相关的数据,声明为static2. static成员函数没有this指针3.在类的外部定义static成员变量4.static与类的一些小应用 1. 不和对象直接相关的数据,声明为static 想象有一个银行账户的类,每个人都可以开银行账户。存…...

数据结构之堆的实现(图解➕源代码)

一、堆的定义 首先明确堆是一种特殊的完全二叉树,分为大根堆和小根堆,接下来我们就分别介绍一下这两种不同的堆。 1.1 大根堆(简称:大堆) 在大堆里面:父节点的值 ≥ 孩子节点的值 我们的兄弟节点没有限制&…...

持续集成部署-k8s-配置与存储-配置管理:ConfigMap

持续集成部署-k8s-配置与存储-配置管理:ConfigMap 1. ConfigMap 简介2. 创建 ConfigMap3. ConfigMap 环境变量与配置文件加载3.1 环境变量的使用3.2 配置文件加载1. ConfigMap 简介 在Kubernetes (K8s) 中,ConfigMap是一种用于存储配置数据的API对象。它用于将应用程序的配置…...

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…...

【KVM】软件虚拟化和硬件虚拟化类型

前言 大家好,我是秋意零。 今天介绍的内容是虚拟化技术以及软件虚拟化和硬件虚拟化。 👿 简介 🏠 个人主页: 秋意零🔥 账号:全平台同名, 秋意零 账号创作者、 云社区 创建者🧑 个…...

ES-初识ES

文章目录 介绍ElasticSearchElasticSearch的主要功能ElasticSearch的主要特性ElasticSearch的家族成员LogStashKibanaBeats ELK(ElasticSearch LogStash Kibana)的应用场景与数据库集成指标采集/日志分析 安装和配置ElasticSearch一、安装1、下载ES安装…...

foreach、for in和for of的区别?

foreach,for...in和for...of是三种不同的循环结构,它们在JavaScript中用来遍历数组或对象的属性。它们有一些重要的区别,以及各自的优点和适用情况。 1.foreach:这是最普通的循环结构,它遍历数组或对象的每一个元素或属…...

CVE-2023-21839 weblogic rce漏洞复现

文章目录 一、漏洞影响版本二、漏洞验证三、启动反弹shell监听切换路径到jdk1.8 四、启动ldap服务五、使用CVE-2023-21839工具来进行攻击测试六、反弹shell 一、漏洞影响版本 CVE-2023-21839是Weblogic产品中的远程代码执行漏洞,由于Weblogic IIOP/T3协议存在缺陷&…...

MQTT java代码演示

以下是使用Eclipse Paho客户端库的Java代码示例,用于连接到MQTT代理并发布和订阅消息。 首先,需要添加Maven依赖项到项目中: <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId>…...

Windows环境下使用VLC获取到大疆无人机的RTMP直播推流

1.环境准备 1.安装nginx 1.7.11.3 Gryphon 下载地址&#xff1a;http://nginx-win.ecsds.eu/download/ 下载nginx 1.7.11.3 Gryphon.zip&#xff0c;解压后修改文件夹名称为nginx-1.7.11.3-Gryphon&#xff1b; 2.安装nginx-rtmp-module 下载地址&#xff1a;GitHub - arut…...

【SpringBoot笔记42】SpringBoot集成knife4j生成接口文档

这篇文章,主要介绍SpringBoot如何集成knife4j及生成接口文档。 目录 一、knife4j接口文档生成器 1.1、接口文档工具介绍 1.2、引入依赖...

Go类型嵌入介绍和使用类型嵌入模拟实现“继承”

Go类型嵌入介绍和使用类型嵌入模拟实现“继承” 文章目录 Go类型嵌入介绍和使用类型嵌入模拟实现“继承”一、独立的自定义类型二、继承三、类型嵌入3.1 什么是类型嵌入 四、接口类型的类型嵌入4.1 接口类型的类型嵌入介绍4.2 一个小案例 五、结构体类型的类型嵌入5.1 结构体类…...

【深度学习】pytorch——实现CIFAR-10数据集的分类

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 往期文章&#xff1a; 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…...

Datawhale-AIGC实践

Datawhale-AIGC实践 部署ChatGLM3-6B平台 clone 项目&#xff0c;配置环境 git clone https://github.com/THUDM/ChatGLM3.git cd ChatGLM3 pip install -r requirement.txt修改web_demo.py, web_demo2.py 设置加载模型的路径修改启动代码: demo.queue().launch(shareFalse…...

C++对象模型

思考&#xff1a;对于实现平面一个点的参数化。C的class封装看起来比C的struct更加的复杂&#xff0c;是否意味着产生更多的开销呢&#xff1f; 实际上并没有&#xff0c;类的封装不会产生额外的开销&#xff0c;其实&#xff0c;C中在布局以及存取上的额外开销是virtual引起的…...

Linux Framebuffer驱动框架、接口实现和使用

Linux 驱动-Frame Buffer代码分析 Framebufferfbmem.c部分代码分析初始化 Framebuffer 对于驱动开发人员来说&#xff0c;其实只需要针对具体的硬件平台SOC和具体的LCD&#xff08;通过焊接连接到该SOC引脚上的LCD&#xff09;来进行第一部分的寄存器编程&#xff08;红色部分&…...

AI:54-基于深度学习的树木种类识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

MVCC详解

什么是MVCC&#xff1f; MVCC&#xff0c;即Multi-Version Concurrency Control &#xff08;多版本并发控制&#xff09;。它是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存。 通俗的讲&am…...

[pytorch]手动构建一个神经网络并且训练

0.写在前面 上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么…...

马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力?新消息泄露该模型支持2.5万个字符上下文!

本文原文来自DataLearnerAI官方网站&#xff1a; 马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力&#xff1f;新消息泄露该模型支持2.5万个字符上下文&#xff01; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051699114783001 马斯克透露xAI…...

spring-session-core排除某些接口不设置session

这里写自定义目录标题 需求实现 需求 今天先写一下如何实现&#xff0c;之后再更新一篇如何发现这个问题的。 我们的项目使用了spring-session-core来存储共享session&#xff0c;存在redis中&#xff0c;然后在cookie中是设置了key为SESSION的session。但是我们有一些开放接口…...

【ElasticSearch系列-05】SpringBoot整合elasticSearch

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...

C/S架构学习之广播

广播&#xff1a;一台主机可以将一个数据包同时发送给同一局域网内所有主机&#xff1b;在IPV4中&#xff0c;广播地址是本网段最大的IP地址或者“255.255.255.255”&#xff1b;注意&#xff1a;广播本质上是UDP通信技术&#xff1b;只有用户数据报套接字才能使用广播的方式&a…...

帧间快速算法论文阅读

Low complexity inter coding scheme for Versatile Video Coding (VVC) 通过分析相邻CU的编码区域&#xff0c;预测当前CU的编码区域&#xff0c;以终止不必要的分割模式。 &#x1d436;&#x1d448;1、&#x1d436;&#x1d448;2、&#x1d436;&#x1d448;3、&#x…...

mooc单元测验第一单元

TCP和OSI参考模型对比 OSI参考模型与TCP/IP参考模型(计算机网络)_osi模型 tcpip模型_李桥桉的博客-CSDN博客 会话层和物理层...

AOC显示器出问题了?别担心,简单重置一下就OK了

你的AOC显示器有问题吗&#xff1f;它是被卡在特定的屏幕上还是根本不显示任何图像&#xff1f;如果你的显示器出现任何问题&#xff0c;只需简单重置即可解决问题。 重置AOC显示器可以帮助解决一系列问题&#xff0c;例如颜色或显示设置问题、输入源检测问题以及其他与软件相…...

ok-解决qt5发布版本,直接运行exe缺少各种库的问题

已实验第二种方法可用。 工具&#xff1a;电脑必备、QT下的windeployqt Qt 官方开发环境使用的动态链接库方式&#xff0c;在发布生成的exe程序时&#xff0c;需要复制一大堆 dll&#xff0c;如果自己去复制dll&#xff0c;很可能丢三落四&#xff0c;导致exe在别的电脑里无法…...

【JavaEE】cookie和session

cookie和session cookie什么是 cookieServlet 中使用 cookie相应的API Servlet 中使用 session 相应的 API代码示例: 实现用户登陆Cookie 和 Session 的区别总结 cookie 什么是 cookie cookie的数据从哪里来? 服务器返回给浏览器的 cookie的数据长什么样? cookie 中是键值对…...