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

GO设计模式——11、装饰器模式(结构型)

目录

装饰器模式(Decorator Pattern)  

装饰器模式的核心角色:

优缺点

使用场景

代码实现


装饰器模式(Decorator Pattern)  

        装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

装饰器模式的核心角色

  • 抽象组件(Component):定义了对象的接口,可以是一个抽象类或接口。
  • 具体组件(ConcreteComponent):实现了抽象组件的接口,是被装饰的对象。
  • 装饰器(Decorator):维持一个指向抽象组件对象的引用,并实现了抽象组件的接口。
  • 具体装饰器(ConcreteDecorator):具体的装饰器对象,用于扩展具体组件的功能。

优缺点

(1)优点:

  • 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

(2)缺点:多层装饰比较复杂。

使用场景

  • 扩展一个类的功能。
  • 动态增加功能,动态撤销。

代码实现

package mainimport ("fmt"
)// 抽象组件:咖啡接口
type Coffee interface {GetDescription() stringGetCost() float64
}// 具体组件:原味咖啡
type PlainCoffee struct{}func (c *PlainCoffee) GetDescription() string {return "Plain Coffee"
}func (c *PlainCoffee) GetCost() float64 {return 1.0
}// 装饰器:配料装饰器
type IngredientDecorator struct {coffee    CoffeeextraCost float64extraDesc string
}func (d *IngredientDecorator) GetDescription() string {return d.coffee.GetDescription() + ", " + d.extraDesc
}func (d *IngredientDecorator) GetCost() float64 {return d.coffee.GetCost() + d.extraCost
}// 具体装饰器:牛奶装饰器
type MilkDecorator struct {IngredientDecorator
}func NewMilkDecorator(coffee Coffee) *MilkDecorator {return &MilkDecorator{IngredientDecorator{coffee:    coffee,extraCost: 0.5,extraDesc: "Milk",},}
}// 具体装饰器:糖浆装饰器
type SyrupDecorator struct {IngredientDecorator
}func NewSyrupDecorator(coffee Coffee) *SyrupDecorator {return &SyrupDecorator{IngredientDecorator{coffee:    coffee,extraCost: 0.3,extraDesc: "Syrup",},}
}func main() {coffee := &PlainCoffee{}fmt.Println("Coffee:", coffee.GetDescription(), "Cost:", coffee.GetCost())coffeeWithMilk := NewMilkDecorator(coffee)fmt.Println("Coffee with Milk:", coffeeWithMilk.GetDescription(), "Cost:", coffeeWithMilk.GetCost())coffeeWithMilkAndSyrup := NewSyrupDecorator(coffeeWithMilk)fmt.Println("Coffee with Milk and Syrup:", coffeeWithMilkAndSyrup.GetDescription(), "Cost:", coffeeWithMilkAndSyrup.GetCost())
}

相关文章:

GO设计模式——11、装饰器模式(结构型)

目录 装饰器模式(Decorator Pattern) 装饰器模式的核心角色: 优缺点 使用场景 代码实现 装饰器模式(Decorator Pattern) 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功…...

全志V3s之U-Boot

1、安装交叉编译器: ARM交叉编译器的官网:交叉编译器 a、使用wget下载: wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xzb、解…...

【华为OD】依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列

题目描述主管期望你来实现英文输入法单词联想功能需求如下:依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀注意1.英文单词联想时,区分大小写2.缩略形式如"dont",判定…...

CentOS 7.9安装宝塔面板,安装gitlab服务器

docker安装方式比较慢,安装包1.3GB 安装后启动很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 软件商店安装方式,失败了2023.12…...

AutoGen多代理对话项目示例和工作流程分析

在这篇文章中,我将介绍AutoGen的多个代理的运行。这些代理将能够相互对话,协作评估股票价格,并使用AmCharts生成图表。 我们创建对话的目的是要求代理分析特定公司的股票价格,并制作股票价格图表。 为了实现这一目标,…...

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-CNN-…...

使用高防IP防护有哪些优势

高防IP是针对互联网服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务,用户可以通过配置高防IP,将攻击流量引流到高防IP,确保源站的稳定可靠。高防IP相当于搭建完转发的服务器。 高防IP有两种接入方式&a…...

android-xml语法

xml解析器 Android的XML文件语法是由Android系统中的解析器解析的。具体来说,Android使用了一个名为"Android Asset Packaging Tool (AAPT)"的工具来解析和处理XML文件。AAPT负责将XML文件编译为二进制格式,并在构建过程中将其打包到Android应…...

【银行测试】第三方支付平台业务流,功能/性能/安全测试方法...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、第三方支付平台…...

全志V3s之显示当前文件路径

新移植的kernel和根文件系统,其终端显示只有一个#号,不方便查看,更改以下配置,使得可以显示全路径。修改如下: export PS1[\u\h \w]\$这个是即时生效的,所以如果要重启或者重新打开窗口也生效的话就要把这…...

小程序跳转tabbar,tabbar页面不刷新

文章地址:12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份: wx.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 wx.reLaunch:关闭所有页面,打开到应用内的某个页面。 wx.reLa…...

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depen…...

C++ SEH结构化异常捕获处理(双平台支持 Linux、Windows)。

测试&#xff1a; try_ctor();try_call([](){printf("1111111111111111111111\r\n");int* p NULL;*p 100;throw 1;// try_eeh();}, [](){printf("2222222222222222222222\r\n");}); 设置NULL指针P的值引发程式崩溃&#xff0c;可以被正确捕获&#xff0…...

jvm-sandbox-repeater 精简版部署之standalone模式

jvm-sandbox-repeater 仅仅提供了录制回放的能力&#xff0c;如果需要完成业务回归、实时监控、压测等平台&#xff0c;后面须要有一个数据中心负责采集数据的加工、存储、搜索&#xff0c;repeater-console提供了简单的demo示例&#xff1b;一个模块管理平台负责管理JVM-Sandb…...

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…...

Docker 与 Podman:揭示容器编排的最佳 25 大常见问题解答

让我们告诉你一件事。 这不仅仅是这两个强大平台之间的普通比较。 相反&#xff0c;我们分析并列出了有关 Docker 与 Podman 的最紧迫问题。 但这里有一件事——这些问题不仅被技术角度所包围。 我们还深入研究了业务环境&#xff0c;因为我们知道这不仅仅是关于代码。这是…...

Spark分布式内存计算框架

目录 一、Spark简介 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;Spark和MapReduce区别 &#xff08;三&#xff09;Spark历史 &#xff08;四&#xff09;Spark特点 二、Spark生态系统 三、Spark运行架构 &#xff08;一&#xff09;基本概念 &#x…...

安装python第三方库后,在pycharm中不能正常导入

python小白学习opencv&#xff0c;使用pip安装完opencv库后import cv2报错&#xff0c;按照如下设置解决&#xff1a; 需要正确设置python解释器路径...

从“食”到“用”,燕之屋的未来增长价值几何?

12月12日&#xff0c;燕窝行业头部企业燕之屋在港交所上市。 作为新消费的热门赛道&#xff0c;近年滋补品的关注度一直比较高。“领头燕”登陆资本市场&#xff0c;是消费者健康养生意识不断提高&#xff0c;滋补品成为营养补充主流的一个积极信号。 长期以来&#xff0c;中…...

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...