【设计模式】第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())
}

四、对比

请添加图片描述

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

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

相关文章

第5天:基础入门-资产架构amp;端口amp;应用amp;CDNamp;WAFamp;站库分离amp;负载均衡

第5天:基础入门-资产架构&端口&应用&CDN&WAF&站库分离&负载均衡 #知识点:1. 资产架构-端口&目录&插件接口&多站点&多应用 2. 番外安全-域名&服务器本身&服务厂商&管理人员 3. 考虑阻碍-站库分离&am…

Redis-使用java代码操作Redis

🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​ 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…

go语言 | grpc原理介绍(一)

参考 https://www.nowcoder.com/discuss/389810396381683712?sourceSSRsearch 这里是b站对应的csdn博客,比较详细的介绍grpc相关原理说明,首先是大概的一个流程图说明。 什么是 RPC ? 远程过程调用(RPC)是计算机科…

[推荐]SpringBoot java实现文件/附件上传下载 服务器 数据库 拿来就用,简单实用

推荐一个思路非常简单又很实用的文件上传下载方式,代码十分简练,可以开箱即用,下面是使用到的一些工具类和业务代码; 1.文件上传实现 判断文件类型的工具类,一些使用到的实体类我会凡在文末,需要可以的自…

吴恩达《机器学习》4-1->4-5:多变量线性回归

一、引入多维特征 在多维特征中,我们考虑的不再是单一的特征,而是一组特征,例如房价模型中可能包括房间数、楼层等多个特征。这些特征将组成一个向量,表示为(𝑥₁, 𝑥₂, . . . , 𝑥ₙ)&#x…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…

ts 简易封装 axios,统一 API

文章目录 为什么要封装目标文件结构封装通用请求方法获得类型提示http 方法文件上传使用示例实例化post 请求类型提示文件上传 总结完整代码: 为什么要封装 axios 本身已经很好用了,看似多次一举的封装则是为了让 axios 与项目解耦。比如想要将网络请求…

视频增强和修复工具 Topaz Video AI mac中文版功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频,包括低分辨率视频、老旧影片、手机录制的视频等。 使用Topaz Video AI非常简单&#xff0c…

突破防火墙的一种方法

当Linux防火墙阻止来自某个ip的数据时,它应该是根据ip数据报里“源IP地址”字段取得的对方ip吧,那对方就不能通过篡改“源IP地址”来绕过防火墙吗?NAT模式下的路由器就修改了这个字段。 但这样的话,攻击者是收不到服务器返回的数…

学 Java 怎么进外企?

作者:**苍何,CSDN 2023 年 实力新星,前大厂高级 Java 工程师,阿里云专家博主,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 🔥热门文章推荐&#…

麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器

原文链接:麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器 hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章01-新创建软件仓库服务器,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上搭建内网…

docker 下安装mysql8.0

在docker中查询mysql镜像 PS C:\Users\admin> docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation……

【Python_GraphicsView 学习笔记(一)】Graphics View框架的基本介绍

【Python_GraphicsView 学习笔记(一)】Graphics View框架的基本介绍 前言正文1、Graphics View框架简介2、Graphics View框架与QPainter类的区别3、Graphics View框架的三个组成部分4、场景QGraphicsScene类5、视图QGraphicsView类6、图形项QGraphicsIte…

深度学习_3 数据操作之线代,微分

线代基础 标量 只有一个元素的张量。可以通过 x torch.tensor(3.0) 方式创建。 向量 由多个标量组成的列表(一维张量)。比如 x torch.arange(4) 就是创建了一个1*4的向量。可以通过下标获取特定元素(x[3]),可以通…

Vue3入门指南:零基础小白也能轻松理解的学习笔记

文章目录 创建项目开发环境项目目录模板语法属性绑定条件渲染列表渲染事件处理内联事件处理器方法事件处理器(常用) 事件参数获取 event 事件事件传参 事件修饰符阻止默认事件阻止事件冒泡 数组变化侦测变更方法替换一个数组 计算属性class 绑定单对象绑…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来,其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪,不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

9月20日,以“多模态 多引擎 超融合 新生态”为主题的亚信科技AntDB数据库8.0产品发布会成功举办,从技术和生态两个角度全方位展示了AntDB数据库第8次大型能力升级和生态建设成果。浙江移动、用友、麒麟软件、华录高诚、金云智联等行业伙伴及业界专家共同…

如何做好网页配色,分享一些配色方案和方法

很多网页设计师在选择网页配色方案时,会纠结于用什么网页UI配色方案来吸引客户的注意力,传达信息。选择正确的颜色是网页设计不可或缺的一部分。本指南将从色彩理论和色彩心理学入手,分享三个网页UI配色的简单步骤。 网页UI配色方法有很多&a…

关于msvcp120.dll丢失的解决方法详解,快速解决dll丢失问题

在计算机使用过程中,经常会遇到“msvcp120.dll丢失”的错误提示。这个错误提示通常出现在运行某些程序或游戏时,造成相关应用程序可能无法正常启动或运行。那么,究竟是什么原因导致了msvcp120.dll文件的丢失呢?本文将详细解析msvc…

在 Linux 中更改 echo 的输出颜色

文章目录 前言一、快速入门二、基本使用2.1 对于常规的输出2.2 对于字体加粗的输出2.3 对于字体斜体的输出2.4 对于带下划线的输出2.5 对于闪烁效果的输出 三、小结 前言 在计算机编程世界中,颜色不仅仅是一种视觉效果,它也是一种信息传递的工具。特别是…