【设计模式】第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卷积神经网络的图像分类系统是一种应用深度学习技术来实现图像分类任务的系统。本摘要将对该系统…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
