【设计模式】第11节:结构型模式之“装饰器模式”
一、简介
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。
特点:可以灵活拓展新功能,动态添加额外职责。
二、UML类图

三、案例
以下案例是咖啡店里卖咖啡,可以只买咖啡,也可以加牛奶、糖等,根据选的调味料的种类来计算最终价格。
package mainimport "fmt"type Coffee interface { Cost() float64
}type SimpleCoffee struct {
}func (SimpleCoffee) Cost() float64 {return 2.0
}type CoffeeDecorator struct {coffee Coffee
}func (cd CoffeeDecorator) Cost() float64 {fmt.Println("ok1")return cd.coffee.Cost()
}type MilkDecorator struct {CoffeeDecorator
}func NewMilkDecorator(coffee Coffee) Coffee {md := MilkDecorator{}md.coffee = coffee return md
}func (md MilkDecorator) Cost() float64 { return md.coffee.Cost() + 0.5
}type SugarDecorator struct {CoffeeDecorator
}func NewSugarDecorator(coffee Coffee) Coffee {sd := SugarDecorator{}sd.coffee = coffeereturn sd
}func (sd SugarDecorator) Cost() float64 {return sd.coffee.Cost() + 0.25
}func main() {coffee := new(SimpleCoffee)coffeeWithMilk := NewMilkDecorator(coffee)coffeeWithMilkAndSugar := NewSugarDecorator(coffeeWithMilk)fmt.Println("Coffee cost: ", coffee.Cost())fmt.Println("Coffee with milk cost: ", coffeeWithMilk.Cost())fmt.Println("Coffee with milk and sugar cost: ", coffeeWithMilkAndSugar.Cost())
}
四、对比

相关文章:
【设计模式】第11节:结构型模式之“装饰器模式”
一、简介 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。…...
Spire.doc读取模板文档,并在书签处插入内容
在书签位置插入文字 //加载模板文档 Document document new Document(Server.MapPath("~/File/评价结果.doc")); //创建书签导航器 BookmarksNavigator bn new BookmarksNavigator(document); //添加一个section到文档 Section newSec document.AddSection(); …...
性能测试实施流程,5个阶段给老板安排的明明白白!
性能测试分为5个阶段,分别是【需求调研阶段】→【测试准备阶段】→【测试执行阶段】→【测试报告阶段】→【测试总结阶段】。 1、需求调研阶段 需求调研分为两个步骤进行:需求调研、需求分析 需求调研 需求调研工作由性能测试实施人员牵头负责&#…...
【教程】R语言生物群落(生态)数据统计分析与绘图
查看原文>>>R语言生物群落(生态)数据统计分析与绘图实践 暨融合《R语言基础》、《tidyverse数据清洗》、《多元统计分析》、《随机森林模型》、《回归及混合效应模型》、《结构方程模型》、《统计结果作图》七合一版本方案 R 语言作的开源、自…...
数据库-用户权限管理
创建用户: create user testlocalhost identified by 123456; create user 创建用户的固定开头 testlocalhost test为用户名, localhost:新建用户可以在哪些主机上登录,即使可以使用IP地址,网段主机名都可以 identified by 1…...
十一、W5100S/W5500+RP2040树莓派Pico<ARP 地址解析>
文章目录 1 前言2 简介2 .1 什么是ARP?2.2 ARP的优点2.3 ARP工作原理2.4 ARP应用场景 3 WIZnet以太网芯片4 ARP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着网络安全越来越受到重…...
可以直接在线制作电子画册的网站
随着互联网技术的发展,越来越多的人开始使用在线工具来制作电子画册。今天,小编就来介绍一款可以直接在线制作电子画册的网站,让你的电子画册更加精美、个性化和实用。 1.首先点击FLBOOK在线制作制作电子杂志平台 2.点击开始制作࿰…...
SortableJS:vuedraggable实现元素拖放排序
文档:https://sortablejs.github.io/Sortable/github:https://github.com/SortableJS/SortableVue2: https://github.com/SortableJS/Vue.DraggableVue3: https://github.com/SortableJS/vue.draggable.nextnpm https://www.npmjs.com/package/vuedragga…...
跟着Nature Communications学作图:纹理柱状图+添加显著性标签!
📋文章目录 复现图片设置工作路径和加载相关R包读取数据集数据可视化计算均值和标准差方差分析组间t-test 图a可视化过程图b可视化过程合并图ab 跟着「Nature Communications」学作图,今天主要通过复刻NC文章中的一张主图来巩固先前分享过的知识点&#…...
88. 合并两个有序数组、Leetcode的Python实现
博客主页:🏆李歘歘的博客 🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知识点&am…...
视频列表:点击某个视频进行播放,其余视频全部暂停(同时只播放一个视频)
目录 需求实现原理实现代码页面展示 需求 视频列表:点击某个视频进行播放,其余视频全部暂停(同时只播放一个视频) 实现原理 在 video 标签添加 自定义属性 id (必须唯一)给每个 video 标签 添加 play 视频播放事件播放视频时&…...
论文-分布式-共识,事务以及两阶段提交的历史描述
这是一段关于一致性,事务以及两阶段提交的历史的描述阅读关于一致性的文献可能会有些困难,因为: 各种用语在不断的演化着(比如一致性<consensus>最初叫做协商<agreement>); 各种研究成果并不是以一种逻辑性的顺序产生…...
[100天算法】-二叉树剪枝(day 48)
题目描述 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。)示例1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1]示例2: 输入: […...
常用编程语言排行与应用场景汇总(2023.10)
文章目录 编程语言排行一、Python二、C三、C四、Java五、C#六、JavaScript七、VB(Visual Basic)八、PHP九、SQL十、ASM(Assembly Language)十一、Go十二、Scratch十三、Delphi/Object Pascal十四、MATLAB十五、Swift十六、Fortran…...
基于 MySQL 多通道主主复制的机房容灾方案
文章中介绍了多种 MySQL 高可用技术,并介绍了根据自身需求选择多通道主主复制技术的过程和注意事项。 作者:徐良,现任中国移动智慧家庭运营中心数据库高级经理,多年数据库运维优化经验,历任华为、一线互联网公司高级 D…...
视频汇聚平台EasyCVR分发的流如何进行token鉴权?具体步骤是什么?
视频监控EasyCVR平台能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视…...
B-5:网络安全事件响应
B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 通过nmap扫描我们发现开启了22端口,…...
第17期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...
透视俄乌网络战之五:俄乌网络战的总结
透视俄乌网络战之一:数据擦除软件 透视俄乌网络战之二:Conti勒索软件集团(上) 透视俄乌网络战之三:Conti勒索软件集团(下) 透视俄乌网络战之四:西方科技巨头的力量 俄乌网络战总结 1…...
深度学习之基于Pytorch卷积神经网络的图像分类系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介二、功能三、图像分类系统四. 总结 一项目简介 基于PyTorch卷积神经网络的图像分类系统是一种应用深度学习技术来实现图像分类任务的系统。本摘要将对该系统…...
ATTiny85通用开发板PCB-4设计:集成电源、音频与诊断的一站式DIY平台
1. PCB-4:一个为四款经典ATTiny85项目而生的通用开发板如果你玩过一阵子电子DIY,特别是对小巧、低功耗的微控制器项目感兴趣,那你很可能听说过或者自己动手做过基于ATTiny85芯片的小玩意儿。这颗只有8个引脚的“小巨人”,以其极低…...
污水管网在线监测系统,精准定位污水偷排源头
当前,城市地下排水管网普遍存在“看不见、摸不着”的监管难题。污水偷排、漏检等现场层出不穷,依赖人工进行监测管理的方式无疑是十分困难的。因此,管理部门需要灵活运用先进技术,积极转变观念,实现对污水管网的定量、…...
九大网盘直链解析工具:如何让文件传输效率提升300%以上
九大网盘直链解析工具:如何让文件传输效率提升300%以上 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...
Arm Cortex-M的FP和MVE
Floating-point Support目前Arm architecture支持的floating-point extension版本是FPv5。FPv5提供了以下功能:单精度算术运算;可选的双精度算术运算;整数、双精度、单精度、和半精度格式之间的转换;用于浮点处理的寄存器…...
微波流式细胞术与机器学习融合:实现非球形微塑料全电子化形态检测
1. 项目概述与核心挑战微塑料污染已成为全球性的环境与健康威胁,其检测与表征是环境科学领域的一项关键技术挑战。传统的主流检测方法,如傅里叶变换红外光谱(FTIR)和拉曼光谱,虽然能够提供高精度的化学成分鉴定&#x…...
融合gws-PINNs与马尔可夫切换模型:反演跳跃系数PDE的混合框架
1. 项目概述与核心挑战在科学计算和工程建模领域,我们经常遇到一个“反着来”的难题:已知一个物理系统的观测数据(比如某个区域随时间变化的温度场、流速场),也知道描述这个系统的大致物理规律(比如热传导方…...
ComfyUI-Manager深度解析:AI工作流扩展管理系统的架构设计与性能优化
ComfyUI-Manager深度解析:AI工作流扩展管理系统的架构设计与性能优化 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable…...
FPGA在遥感机器学习中的优势与优化实践
1. FPGA在遥感机器学习中的核心优势解析 FPGA(现场可编程门阵列)在边缘计算场景中展现出独特的价值主张。与通用处理器不同,FPGA通过硬件级并行架构实现两个关键突破:首先是数据流驱动的计算模式,消除传统冯诺依曼架构…...
CTF流量分析必修课:HTTP/2与HPACK解码实战指南
1. 这不是Wireshark的问题,是你的分析链路断在了第一环你打开NewStarCTF一道Web流量题,导入pcapng文件,熟练地敲下http.request.method "POST",结果空空如也。再试http contains "flag",还是没反…...
C++上位机软件工程师面试记录
目录 (一) 1. Qt 常用多线程类有哪些? 2. Qt 多线程不重写 run() 如何使用? 3. TCP 粘包、半包问题如何处理? 4. TCP 与 UDP 有什么区别? 5. TCP 三次握手、四次挥手基本原理 6. Modbus RTU 和 Modbus TCP …...
