当前位置: 首页 > 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 "<…...

3步掌握Umi-OCR批量处理:从海量图片中高效提取文字

3步掌握Umi-OCR批量处理&#xff1a;从海量图片中高效提取文字 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_…...

蓝芯算力:RISC-V 芯片破局之路

字节跳动前高管卢山创办的蓝芯算力完成数亿元融资&#xff0c;专注 RISC-V AI 算力芯片研发。目前已获超 20 万片订单&#xff0c;在 x86 和 ARM 主导的市场中开辟差异化道路。创始人背景与创业初衷蓝芯算力创始人卢山毕业于清华&#xff0c;有超 20 年芯片设计经验。他曾就职英…...

OpenClaw技能扩展实战:基于Qwen3-32B-Chat实现公众号自动发布

OpenClaw技能扩展实战&#xff1a;基于Qwen3-32B-Chat实现公众号自动发布 1. 为什么需要自动化公众号发布 作为一个技术博主&#xff0c;我每周都要在公众号发布2-3篇技术文章。最让我头疼的不是写作本身&#xff0c;而是发布前的繁琐流程&#xff1a;手动调整Markdown格式、…...

python汽车4s店的汽车租赁服务管理系统vue

目录功能模块分析租赁服务核心功能技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作功能模块分析 用户管理模块 用户注册与登录&#xff1a;支持手机号、邮箱注册&#xff0c;集成短信验证码功能。权限…...

Laravel 5.x核心特性与升级指南

Laravel 5.x 系列是 PHP 框架的重要升级版本&#xff0c;引入了多项创新特性。以下是核心特性总结&#xff1a;一、核心架构改进目录结构优化采用 app/Http 统一存放控制器、中间件和请求类&#xff0c;逻辑分层更清晰&#xff1a;app/├── Http/│ ├── Controllers/│ …...

WarcraftHelper:魔兽争霸3现代优化解决方案 - 突破兼容性壁垒,重焕经典游戏活力

WarcraftHelper&#xff1a;魔兽争霸3现代优化解决方案 - 突破兼容性壁垒&#xff0c;重焕经典游戏活力 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper …...

4大解决方案提升Blender项目质感:从资源获取到渲染优化的完整指南

4大解决方案提升Blender项目质感&#xff1a;从资源获取到渲染优化的完整指南 【免费下载链接】awesome-blender &#x1fa90; A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trendin…...

Vue3实战:5分钟搞定全局WebSocket封装(含心跳检测与断线重连)

Vue3全局WebSocket封装实战&#xff1a;心跳检测与断线重连的最佳实践 WebSocket在现代Web应用中扮演着越来越重要的角色&#xff0c;特别是在需要实时数据更新的场景中。Vue3作为当前最流行的前端框架之一&#xff0c;与WebSocket的结合能够为开发者提供强大的实时交互能力。本…...

Z-Image-Turbo-辉夜巫女详细步骤:Xinference服务状态检查+Gradio端口映射配置

Z-Image-Turbo-辉夜巫女详细步骤&#xff1a;Xinference服务状态检查Gradio端口映射配置 1. 模型简介 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的LoRA版本&#xff0c;专门用于生成具有辉夜巫女风格的人物图片。这个模型通过Xinference框架部署&#xff0c;提供了稳定…...

ReactPy服务端渲染终极指南:如何在Python中构建现代Web应用

ReactPy服务端渲染终极指南&#xff1a;如何在Python中构建现代Web应用 【免费下载链接】reactpy Its React, but in Python 项目地址: https://gitcode.com/gh_mirrors/re/reactpy ReactPy是Python中构建用户界面的革命性库&#xff0c;让你无需JavaScript就能创建现代…...