设计模式:Go装饰模式

golang设计模式——结构模式 结构模式主要关注类和对象的组合 阅读详情

设计模式:Go装饰模式

结构型模式

1. 简介

装饰模式向一个现有对象添加新功能或修改原有功能,同时又不改变其原有结构。

优点

  1. 不修改原有对象添加或修改原有功能。

缺点

  1. 多层装饰会大幅度提高代码复杂度。

2. UML

decorator

3. 演示

3.1. 文件树型图

decorator
├── calc.go
├── calculator.go
├── decorator.go
├── decorator_test.go
└── go.mod

3.2. 代码

calculator.go

package decorator

// 计算器接口
type Calculator interface {
	Add(a, b int) int
	Minus(a, b int) int
}

calc.go

package decorator

// 计算器实现
type Calc struct {
}

func (c Calc) Add(a, b int) int {
	return a + b
}

func (c Calc) Minus(a, b int) int {
	return a - b
}

decorator.go

package decorator

import "math"

// 装饰
type CalcDecorator struct {
	Calculator
}

func (c CalcDecorator) Minus(a, b int) int {
	return int(math.Abs(float64(c.Calculator.Minus(a, b))))
}

func (c CalcDecorator) Multiply(a, b int) int {
	return a * b
}

func (c CalcDecorator) Division(a, b int) int {
	return a / b
}

decorator_test.go

package decorator

import (
	"testing"
)

func TestDecorator(t *testing.T) {
	var c Calculator = &Calc{}
	calcDecorator := &CalcDecorator{c}
	t.Log(calcDecorator.Add(1, 2))
	t.Log(calcDecorator.Minus(1, 2))
	t.Log(calcDecorator.Multiply(1, 2))
	t.Log(calcDecorator.Division(1, 2))
}

3.3. 测试

=== RUN   TestDecorator
    TestDecorator: decorator_test.go:10: 3
    TestDecorator: decorator_test.go:11: 1
    TestDecorator: decorator_test.go:12: 2
    TestDecorator: decorator_test.go:13: 0
--- PASS: TestDecorator (0.00s)
PASS

4. 参考

Go语言设计模式:装饰模式详解(代码可直接运行) 装饰模式是一种动态扩展对象功能的设计模式,通过包装核心对象来添加新功能。文章介绍了装饰模式的核心思想、结构(组件、具体组件、装饰器和具体装饰器)及其优缺点(灵活性高但可能增加复杂性)。在Go语言中,通过接口和结构体组合实现了该模式,示例展示了如何为数据源添加加密和日志功能。完整代码演示了装饰器的组合使用,体现了动态叠加功能的优势。 阅读详情

相关推荐

Go 设计模式中装饰模式应用

装饰模式通过创建一个装饰器类,该类实现了与被装饰对象相同的接口,并持有一个被装饰对象的引用。装饰器类在调用被装饰对象的方法之前或之后,执行额外的行为,从而扩展了被装饰对象的功能。可以看到,装饰器模式允许我们在不修改具体组件的情况下,通过装饰器的组合来动态地添加新的功能。在上述示例中,装饰器A和装饰器B分别添加了额外的操作,而不影响具体组件的原有功能。的操作,实际上会按照装饰器链的顺序依次执行装饰器的操作,最终执行到具体组件的操作。是具体的装饰器实现类,通过扩展装饰器的功能来增强被装饰对象。

走向CTO的路上... 355

Go实现设计模式--装饰者(器)模式

文章目录定义介绍代码示例 定义 动态的将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。 介绍 意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。 何时使用:在不想增加很多子类的情况下扩展类。 如何解决:将具体功能...

hello_bravo_的博客 352

数学概念 | 旋转矩阵、欧拉角、四元数

旋转矩阵、欧拉角、四元数概念及相关运算;

NapoleonCoder的博客 772

Golang设计模式——22装饰者模式

package Decorator import ( "log" "math" "time" ) func pi(n int) float64 { ch := make(chan float64) for k := 0; k < n; k++ { go func(ch chan float64, k float64) { ch <- 4 * math.Pow(-1, k) / (2*k + 1) }(ch, float64(k)) } result := 0.0

清风 751

【可信数据空间-连接器技术架构设计方案】

一句话概括连接器是可信数据空间的“数据保镖”和“外交官”。连接器就是一个部署在你本地的软件代理,它代表你安全地对外提供数据服务,确保在共享数据价值的同时,牢牢守住数据的所有权和控制权。它是实现“数据可用不可见”这一理想的关键技术部件。一个生动的比喻:银行的金库和接待员想象一下,你的数据就是藏在银行金库里的黄金和钞票。金库(你的内部数据库): 绝对安全,外人绝对不能进。接待员(连接器): 坐在银行大厅里,负责与客户打交道。客户向接待员提出请求:“我想取1000元。

u014716614的博客 2267

光斑大小控制【ZEMAX操作数】

在使用Zemax优化光学系统时,对成像的聚焦光斑大小进行限制,即弥散斑的大小; 一、RSCE(质心RMS光斑半径):二、RSCH(光线RMS光斑半径):

yh的博客 7862

Go讲解:装饰者模式

装饰者模式的主要目的是提供一种灵活的方式来为对象添加新的行为或职责,而不需要修改对象的原始类。通过引入装饰者类,可以在运行时动态地组合不同的功能,而不需要创建大量的子类。装饰者模式的核心思想是将对象包装在一个或多个装饰者中,每个装饰者都可以在调用被装饰对象的方法之前或之后添加额外的行为。首先,定义一个组件接口,表示文本对象的通用行为。// TextComponent 定义了文本对象的通用行为然后,定义一个装饰者接口,持有一个组件对象的引用,并实现了组件接口。

软件架构师笔记 1248

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析

本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。

weixin_29245767的博客 1151

【寒江雪】Go实现装饰者模式

Decorator Pattern   装饰着模式可以在需要扩展某个类的时候,动态地修改而不需要在内部添加代码,也可以防止类爆炸。    装饰者模式可以提供了灵活地扩展方案. 实现   实现一个日志的自定义功能. package decorator import ( "time" "fmt" ) type LogDecorate interface { ...

寒江雪的博客 864

OpenMontage:AI代理驱动的端到端视频生产系统实战指南

在当今内容创作领域,自动化视频生成技术正成为提升生产效率的关键。其核心原理在于通过智能体(Agent)架构,将复杂的视频制作流程拆解为可被AI理解和执行的标准化任务,从而实现从创意到成片的端到端自动化。这项技术的核心价值在于大幅降低了专业视频制作的门槛,使非专业用户也能快速产出具有一定专业度的内容。其典型应用场景包括社交媒体短片、产品演示、知识科普视频的批量生产。OpenMontage正是这一技术理念的杰出实践,它构建了一个完整的代理驱动视频生产系统,将AI编码助手转变为能自主规划并执行脚本撰写、素材检索、

weixin_35757191的博客 647

NVIDIA Isaac Sim 联合 VS Code 开发调试环境配置

在 Visual Studio Code (VS Code) 中打开 Isaac Sim 软件包主文件夹,即可打开该工作区。注意建议在学习教程和示例时使用 Visual Studio Code。另请参见有关 VS Code 工作区的详细信息,请参阅 Visual Studio Code (VS Code) 文档。

2506_90492529的博客 3103

实践GoF的23种设计模式:装饰者模式

装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力。理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性。

华为云官方博客 1102

ArXiv 2026 即插即用 | Transformer篇 | WeightFormer:告别二次复杂度!无注意力的线性时间 Transformer,泛化能力拉满

WeightFormer是一种创新的动态Transformer架构,其核心创新在于通过双动态算子(空间自适应动态卷积和双边激活动态线性)实现输入自适应的特征提取。该模块采用静态-动态权重融合机制和低秩预测技术,在仅增加5%参数量的情况下显著提升模型泛化能力。相比传统Transformer,WeightFormer在ImageNet-1K上提升2.3%精度,小样本任务提升12%,同时保持线性计算复杂度。模块可直接替换标准Transformer块,特别适合轻量级视觉任务,实现了精度与效率的平衡。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 128

Rufus 3.22 是 Win7 启动盘的最终选择:完整操作指南

系统还停在 Windows 7、想给 U 盘做 Win7 启动盘,答案就是 Rufus 3.22:它是 Win7 上最后一个能正常打开使用的版本。4.0 起系统基线抬到 Win8 及以上,Rufus Win7 兼容版本就此定格在 3.22。这一代没有自动升级,动手做盘之前,先确认左下角的版本号。 ## 怎么挑对 Rufus 安装包 - 打开主界面看左下角版本号:4 及以上在 Win7 上打不开

gitblog_00237的博客 221

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 834

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用Go实现23种设计模式——结构型模式(上)

将一个类的接口转换成客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器模式优点 可以让两个没有关联的类一起运行,复用了现有的类 目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题 适配器模式缺点 增加了系统的复杂性 降低了代码可读性 桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化 桥接模式优点 抽象与实现分离,扩展能力强 符合开闭原则、合成复用原则 桥接模式缺点 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正

请叫我雯子小姐的小爷的博客 307

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

使用Go实现GoF的23种设计模式(三)

前言 上一篇文章《使用Go实现GoF的23种设计模式(二)》中,我们介绍了结构型模式(Structural Pattern)中的组合模式、适配器模式和桥接模式。本文将会介绍完剩下的几种结构型模式,代理模式、装饰模式、外观模式和享元模式。本文将会继续采用消息处理系统作为例子,如果对该例子不清楚,请移步《使用Go实现GoF的23种设计模式(一)》和《使用Go实现GoF的23种设计模式(二)》对其相关的设计和实现进行了解。 代理模式(Proxy Pattern) 简介 代理模式为一个对象提供一种代理以控制对该对

ruanrunxue的博客 571

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Golang 常见设计模式之装饰模式

简单了解了 Go 语言中如何实现装饰模式后,我们通过一个 Web Server 程序中间件,学习了装饰模式在 Go 语言中的应用。需要注意的是,尽管 Go 语言实现的装饰器有类型上的限制,不如 Python 装饰器那般通用。就像我们最终实现的 pipelineHandlers 不如 Gin 框架中间件强大,比如不能延迟调用,通过 c.Next () 控制中间件调用流等。但不能因为这样就放弃,因为 GO 语言装饰器依然有它的用武之地。

weixin_43770745的博客 410

装饰模式(Decorator Pattern)在 Go 语言中的应用

本文详细介绍了装饰模式(Decorator Pattern)在Go语言中的应用,并通过实例展示了如何动态地给对象添加职责而不改变其结构。文章首先解释了装饰模式的核心概念,即通过创建包装类(装饰器)来在运行时添加新功能。接着,通过实现一个权限校验接口RightsChecker的示例,展示了如何创建装饰器RightsCheckerDecorator来添加日志记录和权限检查等额外行为。文章还比较了装饰模式与中间件的不同,强调了装饰模式适用于动态添加职责的场景,而中间件适用于处理Web请求和响应的通用任务。最后,文

tatasix的博客 1461

go的设计模式

在2020年七月最后一个星期,我开始学习了go的设计模式 设计模式 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结 分类 创建型( 单例模式、简单工厂模式、工厂方法模式、抽象厂模式、建造者模式、原型模式) 结构型(代理模式、适配器模式、装饰模式、桥接模式、组合模式、享元模式、外观模式) 行为型(观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式) 五大原则 1、开闭原则 开放扩展,关闭修改 开闭原则的主旨是为了

qq_44981657的博客 3488

设计模式go语言实现----装饰模式decorator

我们每天早上起来都需要穿衣服,我们穿衣服的过程就是装饰自己的过程,而且我们可能每次穿衣服的顺序也不一样,比如有一天张三起床,他首先穿上红内裤,然后再穿上花裤衩,然后再穿上大码衬衫,然后穿上西装,然后就出门了;又有一天张三起床,首先穿上西裤,然后穿上红内裤,然后穿上花短袖,然后穿上棉服就出门了。在这个过程中,我们发现张三穿衣服的顺序以及衣服款式都是不固定的,非常灵活,想穿什么穿什么。 既然穿衣可以这...

cloudUncle的博客 1592

带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式

摘要:本文我们主要介绍结构型模式中的代理模式、装饰模式、外观模式和享元模式。

华为云官方博客 2532

Go 语言 设计模式-装饰模式

装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。

Ch3nnn的博客 462

golang设计模式(9)装饰模式

golang装饰模式

课前的博客 1818

go语言设计模式

设计模式(go语言) 这里写目录标题设计模式(go语言)1. 简单工厂模式( Simple Factory Pattern )1.1. 模式动机1.2. 模式定义1.3. 模式结构1.4.代码示例2. 工厂方法模式(Factory Method Pattern)2.1. 模式动机2.2. 模式定义2.3. 模式结构2.4. 代码示例3. 抽象工厂模式(Abstract Factory)3.1. 模式动机3.2. 模式定义3.3. 模式结构3.4. 代码示例4. 建造者模式/生成器模式(Builder Pat

A0AA0aaa的博客 1429
上一篇: Git:stash
下一篇: 排序算法:快速排序
yimtcode
博客等级 码龄6年 205粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值