设计模式大白话——装饰者模式

news2024/11/17 3:28:46

装饰者模式

文章目录

  • 装饰者模式
      • 一、概述
      • 二、应用场景
      • 三、代码示例
      • 四、小结

一、概述

装饰设计模式

​ 装饰者模式,此模式最核心之处在于装饰二字,之所以需要装饰,是因为基础的功能无法满足需求,并且装饰是临时的,并不是永久的,可以随场景变化替换成其他的。

二、应用场景

​ 为了方便理解,下面我举几个生活中的例子:

  • 穿衣服:觉得冷时, 你可以穿一件毛衣。 如果穿毛衣还觉得冷, 你可以再套上一件夹克。 如果遇到下雨, 你还可以再穿一件雨衣。 所有这些衣物都 “扩展” 了你的基本行为, 但它们并不是你的一部分, 如果你不再需要某件衣物, 可以方便地随时脱掉。

  • 数据加解密:对于原始的数据,我们可以对其进行压缩、加密、变换等一系列操作,这些操作其实是对原始数据的装饰。

  • 发送通知:对于已有的基础通知,我们想要根据情况的不同在其之上再拓展其他类型的通知,比如,拓展短信通知、公众号通知、微信小程序通知等等。

    如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。

三、代码示例

👉**代码在线运行链接**👈

下面的 golang 示例代码,将以通知场景为例子:

实现其他类型通知后的库结构

package main

// Notifier 通知器接口
type Notifier interface {
	Notify()
}

type BasicNotifier struct {
}

func (b *BasicNotifier) Notify() {
	println("send basic message")
}

type SMSDecorator struct {
	// 被装饰的对象
	Notifier
}

func (s *SMSDecorator) Notify() {
	// 注意:此处发送短信的顺序是在调用被装饰对象的 Notify 方法之后,实际上这里可以根据需求自由调整
	s.Notifier.Notify()
	println("send SMS")
}

type EmailDecorator struct {
	// 被装饰的对象
	Notifier
}

func (e *EmailDecorator) Notify() {
	e.Notifier.Notify()
	println("send email")
}

type WeChatDecorator struct {
	// 被装饰的对象
	Notifier
}

func (w *WeChatDecorator) Notify() {
	w.Notifier.Notify()
	println("send WeChat")
}

func main() {
	weChatDecorator := &WeChatDecorator{
		Notifier: &EmailDecorator{
			Notifier: &SMSDecorator{
				Notifier: &BasicNotifier{},
			},
		},
	}
	// send basic message
	// send SMS
	// send email
	// send WeChat
	weChatDecorator.Notify()
}

四、小结

​ 在 Java 中,java.io 包下使用到了装饰者模式,如:FileInputStream 可以被 BufferedInputStream 装饰,然后再被 LineNumberInputStream 装饰。

​ 现在,结合之前的理解,我们可以给装饰者模式如下定义:

装饰者模式——动态地将责任附加到对象上。想要拓展功能,装饰者提供有别于继承的另一种选择

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

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

相关文章

基于Java+spring+springMvc+mybatis+jsp学生选课管理系统

基于JavaspringspringMvcmybatisjsp学生选课管理系统 一、系统介绍二、功能展示1.课程列表(学生)2.已选课程(学生)3.已修课程(学生)4.我的课程(老师)5.课程打分(老师)6.课程管理、学生管理、教师管理(系统管理员&#…

python字典:怎么取出key对应的值

目录 python中的字典是什么 怎么判断key是否在字典中 怎么取出key对应的值 总结 python中的字典是什么 在Python中,字典(Dictionary)是一种无序且可变的数据类型,用于存储键-值(Key-Value)对。字典通过…

电脑卡顿反应慢怎么处理?提升反应速度的方法

电脑卡顿反应慢是很常见的问题,然而,我们可以采取一些方法来处理这个问题,帮助大家提升电脑反应速度。​ 一、提升电脑反应速度的方法 当电脑运行顺畅时,我们的工作体验也会更加愉悦。然而,如果电脑出现卡顿反应慢的…

【项目设计】MySQL 连接池的设计

目录 👉关键技术点👈👉项目背景👈👉连接池功能点介绍👈👉MySQL Server 参数介绍👈👉功能实现设计👈👉开发平台选型👈👉MyS…

【雕爷学编程】MicroPython动手做(24)——掌控板之拓展掌控宝

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

【雕爷学编程】MicroPython动手做(23)——掌控板之WiFi与蓝牙2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

1400*D. Candy Box (easy version)(贪心)

3 10 9 Example input 3 8 1 4 8 4 5 6 3 8 16 2 1 3 3 4 3 4 4 1 3 2 2 2 4 1 1 9 2 2 4 4 4 7 7 7 7 output 题意: n个糖果,分为多个种类,要求尽可能的多选,并且使得不同种类的数量不能相同。 解析: 记录每种糖…

音视频技术开发周刊 | 304

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 更强的Llama 2开源,可直接商用:一夜之间,大模型格局变了 Meta 终于发布了大家期待已久的免费可商用版本 Llama 2。 6000份问卷透露出AI…

Java生成二维码——附Utils工具类

参加2023年的计算机设计大赛国赛,拿到了一等奖。 现在将项目中的工具类代码剥离出来,方便之后项目开发中复用。 实现效果: 代码实现: import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import c…

挑战双面侧柱碰试验:比亚迪CTB保障高品质出行

对于用户来说,选择汽车时最应该重视的要素是什么? 第一,是安全;第二,是安全;第三,还是安全! 那么作为新能源汽车的代表,比亚迪在保障驾乘人员的安全方面又是怎样做的呢&a…

基于SpringCloud+Vue的分布式架构网上商城系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

FPGA实现NIC 10G UDP协议栈网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详解6、上板…

国内 github.com经常打不开的解决办法

1、打开网站http://tool.chinaz.com/dns/ 2、在A类型中填写github.com,再点击监测按钮 3、复制下面任意一个ip 4、打开电脑文件C:\Windows\System32\drivers\etc下的host文件 5、在host文件的最后一刚加入刚才复制的IP 6、重新打开GitHub

对外接口签名生成方式

接口签名生成方式 前言 当某个系统对外部系统提供接口访问时,为提高接口请求安全性,往往会在接口访问时添加签名,当外部系统访问本系统签名验证成功时才能正常返回数据,一般接口提供方会与外部系统提前约定好,不同外…

六天入门PyTorch深度学习(1/6)

六天带你入门PyTorch深度学习(1/6) 之PyTorch初认识 Pytorch深度学习快速入门简易教程,适合所有新手学习打好框架基础 跟着我的节奏一步一步学,一周即可掌握 跟着我的节奏一步一步学,一周即可掌握 import torch #导入torch库&#xff0c…

django4.2 day1Django快速入门

1、创建虚拟环境 打开cmd安装virtualenv pip install virtualenvwrapper-winworkon 查看虚拟环境mkvirtualenv 创建新的虚拟环境删除虚拟环境 rmvirtualenv 进入虚拟环境 workon env 2、创建django虚拟环境并安装django 创建虚拟环境mkvirtualenv django4env进入虚拟环境安…

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器,可以替代普通的硬件的交换机或其LVS类似的复杂机制,实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下,frontend-conf.为前端配置,包括绑定的端口等,js…

牛客网Verilog刷题——VL45

牛客网Verilog刷题——VL45 题目解析答案 题目 请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。 双口RAM端口说明: 异步FIFO端口说明: 双口RAM代码如下&#xff0…

第七章 HL7 架构和可用工具 - 使用 HL7 消息查看器页面

文章目录 第七章 HL7 架构和可用工具 - 使用 HL7 消息查看器页面使用 HL7 消息查看器页面选择选项解析消息 第七章 HL7 架构和可用工具 - 使用 HL7 消息查看器页面 使用 HL7 消息查看器页面 为 HL7 提供了消息查看器页面。可以使用此页面显示、转换和导出 HL7 消息&#xff0…

【力扣每日一题】2023.7.31 重排链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一个链表,让我们按照题目要求原地修改重排链表。 那么具体怎么个重排法呢,题目给出了一串式子,其实就是把链表分为前后两段,然后在前半段的节…