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

架构师-设计模式-装饰器模式 顾名思义,装饰器模式就是给一个对象增加一些新的功能,而且是【动态】的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例   这里的动态指的是用户可以根据自己的需求把之前定好的功能任意组合。装饰器模式(Decorator Pattern)是一种结构型设计模式,其核心思想是通过将对象包装在一个装饰器类中,动态地为其添加新的行为或功能,而无需修改原有类的定义。当需要向原始对象添加新功能时,可以创建一个新的装饰器对象,并将原始对象作为参数传递给装饰器对象的构造函数。 阅读详情

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

1 定义

装饰模式(Decorator): 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

我们对比一下建造者模式,建造者模式要求建造的过程必须是稳定的,也就是我们必须经过A–>B–>C道工序,才能生产出产品P。但是装饰模式的建造过程是不稳定的,我们可以经过A–>B–>C生产出P,也可以经过C–>B–>A生产出P,还可以B–>A–>C生产出P等等等等。。。。
UML类图:
在这里插入图片描述
由于go里面没有继承的概念,所以可以将上面类图中红色框中的interface去掉。
几个重要的角色:

  • Component(抽象构建):具体构建和抽象装饰类的基类,声明了在具体构建中实现的业务方法,UML类图中的Component
  • ConcreteComponent(具体构建):抽象构建的子类,用于定义具体的构建对象,实现了在抽象构建中声明的方法,装饰器可以给它增加额外的职责(方法),UML类图中的Window、TextBox、ListBox
  • Decorator(抽象装饰类):也是抽象构建类的子类,用于给具体构建增加职责,但是具体职责在其子类中实现,UML类图中的ComponentDecorator
  • ConcreteDecorator(具体装饰类):抽象装饰类的子类,负责向构建添加新的职责,UML类图中的ScrollBarDecorator、BlackBorderDecorator

2 go语言实现

2.1 实现Component抽象类以及ConcreteComponent具体构建

type Component interface {
	Display()
}

type Window struct{}

func (w Window) Display() {
	fmt.Println("显示窗体")
}

type TextBox struct{}

func (t TextBox) Display() {
	fmt.Println("显示文本框")
}

type ListBox struct{}

func (l ListBox) Display() {
	fmt.Println("显示列表框")
}

2.2 实现ConcretDecorator具体装饰类

type ScrollBarDecorator struct {
	Component
}

func (sbd ScrollBarDecorator) Display() {
	fmt.Println("为构建增加滚动条")
	sbd.Component.Display()
}

type BlackBorderDecorator struct {
	Component
}

func (bbd BlackBorderDecorator) Display() {
	fmt.Println("为构建增加黑色边框")
	bbd.Component.Display()
}

2.3 定义工厂函数生产出具体装饰类

func NewDecorator(t string, decorator Component) Component {
	switch t {
	case "sbd":
		return ScrollBarDecorator{
			Component: decorator,
		}
	case "bbd":
		return BlackBorderDecorator{
			Component: decorator,
		}
	default:
		return nil
	}
}

2.4 测试demo

func main() {
	component := decorator.Window{}
	tScrollBarDecorator := decorator.NewDecorator("sbd", component)
	tScrollBarDecorator.Display()
	fmt.Println("==============================")
	tBlackBorderDecorator := decorator.NewDecorator("bbd", tScrollBarDecorator)
	tBlackBorderDecorator.Display()
}
Go 设计模式中装饰模式应用 装饰模式通过创建一个装饰器类,该类实现了与被装饰对象相同的接口,并持有一个被装饰对象的引用。装饰器类在调用被装饰对象的方法之前或之后,执行额外的行为,从而扩展了被装饰对象的功能。可以看到,装饰器模式允许我们在不修改具体组件的情况下,通过装饰器的组合来动态地添加新的功能。在上述示例中,装饰器A和装饰器B分别添加了额外的操作,而不影响具体组件的原有功能。的操作,实际上会按照装饰器链的顺序依次执行装饰器的操作,最终执行到具体组件的操作。是具体的装饰器实现类,通过扩展装饰器的功能来增强被装饰对象。 阅读详情

相关推荐

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

GO 常用设计模式

常见设计模式总结 + Go实现

做一只熊猫不好吗? 5217

【王道训练营 C/C++方向基础 60 题(31-40)】

王道训练营 C/C++方向基础 60 题(31-40)

qq_55805517的博客 3067

合集|用 Go 语言实现 23 种设计模式

今天是咱们用Go学设计模式系列的最后一期,整个系列中我带着大家一起学习了经典的23种设计模式用Go语言如何来实现,以及它们在日常工作开发中的应用场景。我看了一下发文记录,从2022年7月18更新第一篇观察者模式,到5月22号发布了最后一种设计模式--中介者模式,一共历时10个月,发布了23篇文章。从最一开始的不准备整理成系列写到哪算哪,到中期形成自己的写作风格,有目标的去学习整理再发布,对自己来说...

slphahaha的博客 1864

OAK-D-Pro深度解析:从硬件融合到全天候SLAM实战

本文深度解析OAK-D-Pro硬件架构及其在SLAM领域的实战应用。作为SLAM的"六边形战士",OAK-D-Pro融合主动双目摄像头、结构光投射器、6轴IMU等传感器,实现全天候稳定工作。通过实测数据展示其在弱纹理环境、动态光照等复杂场景下的卓越表现,并提供SLAM实战技巧与开发指南,帮助开发者快速部署高效SLAM解决方案。

weixin_27244795的博客 183

ZYNQ-Video out IP与Video Timing Controller IP协同工作模式解析

本文深入解析了ZYNQ平台上Video out IP与Video Timing Controller IP的协同工作模式,详细介绍了它们的架构、工作原理及配置要点。通过AXI4-Stream接口实现高效视频数据传输,并结合HDMI输出系统设计实践,为开发者提供了实用的调试技巧和性能优化建议。

redis7keeper的博客 637

Go 23种设计模式

抽象工厂模式基于工厂方法模式。两者的区别在于:工厂方法模式是创建出一种产品,而抽象工厂模式是创建出一类产品。这二种都属于工厂模式,在设计上是相似的。假设,有一个存储工厂,提供redis和mysql两种存储数据的方式。如果使用工厂方法模式,我们就需要一个存储工厂,并提供SaveRedis方法和SaveMysql方法。如果此时业务还需要分成存储散文和古诗两种载体,这两种载体都可以进行redis和mysql存储。

快乐的搬砖的博客 2736

Dify框架面试内容整理-如何进行Dify的二次开发?

无论是轻量修改界面,还是深度集成自定义模型、Agent、知识库,你都可以很方便地进行二次开发。,你可以基于它的开源架构对功能进行扩展、集成第三方服务、修改界面风格,甚至定制新的AI工作流程。前端:Node.js >= 16,React + TypeScript + Tailwind。接入自己的模型API(如:调用LLaMA、Baichuan、ChatGLM)。修改路径:/api/app/services/providers/可接入你自己的向量数据库(Qdrant、Milvus、FAISS)

不务正业的猿 2002

Go:常见的几种设计模式解析

在软件工程中,设计模式是解决常见问题的一套经典解决方案。Go 语言,作为一种强调简洁和高效的编程语言,其设计模式同样体现了这些理念。本文将探讨 Go 语言中常见的几种设计模式,包括单例模式、工厂模式、策略模式、观察者模式,并用 UML 创建概念模型来直观展示这些设计模式的结构。

十年运维开发经验的王义杰在此分享自己的知识和经验 1052

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4891

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

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

tatasix的博客 1461

矿石生成(1)

这个提供了标准化的矿石放置配置模板简化了常见和稀有矿石的配置过程遵循了Minecraft原版的世界生成模式提高了代码的可读性和可维护性通过使用这个类,模组开发者可以更轻松地配置矿石的生成规则,而不需要每次都手动编写完整的放置修饰符列表。这种设计模式在原版Minecraft和其他大型模组中也很常见,是一种良好的编程实践。// 导入语句...// 字段和方法...包声明表明这个类位于luckymod模组的WorldGen包中,专门处理世界生成相关配置。导入语句。

qq_24992377的博客 136

《大话设计模式-Golang》装饰模式

装饰模式实现给人搭配不同的衣服

weixin_45717355的博客 173

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

装饰设计模式(Decorator degin pattern)

go实现装饰模式

gongranr的博客 420

lwip-2.0.3

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

大话设计模式 -- Golang实现

DesignPatternUse GO language to achieve 23 design patterns 该项目是拜读《大话设计模式》后,学习Golang语言实现的,有很多不足之处,有待完善 有些模式是根据UML图编写的基本框架,有些是基于特定的环境下编写的实例创建型模式 Abstract Factory抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的

aa779025105的专栏 7878

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Decorator

一、前言 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀;如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低? Decorator模式动态(组...

xinwenhuayu的博客 248

装饰模式(Decorator)-----基于JAVA语言

装饰模式(Decorator) 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是【动态】的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例.这里的动态指的是用户可以根据自己的需求把之前定好的功能任意组合。........

yang505581644的博客 186

设计模式java装饰_java设计模式之装饰模式(decorator)

package com.dylan.gof.pattern.decorator;/*** Generated by StarUML(tm) Java Add-In* @ Project : Untitled* @ File Name : Decorator.java* @ Date : 2011-2-16* @ Author : Dylan** @desc:* 抽象构件:* 原始的功能接口 ,为...

weixin_31957989的博客 166

关于23种设计模式的有趣见解(转载)

好东西不得不转 在网上看见了这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的启发作用。 创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要

大宇的专栏 515

Go 项目开发常用设计模式

介绍了 Go 项目开发过程中常见的设计模式,包括:单例模式、工厂模式、策略模式、模板模式、代理模式、选项模式

Shoulen的博客 1995

Go语言中常见的6个设计模式

Go语言中常见的6个设计模式

席万里的博客 892

Go语言设计模式(23种)

1.观察者模式2.装饰器模式3.工厂模式4.单例模式5.策略模式6.模板模式7.代理模式8.抽象工厂模式9.桥接模式10.外观模式11.适配器模式12.中介模式13.建造者模式14.解释器模式15.访问者模式16.命令模式17.组合模式18.责任链模式19.迭代器模式20.状态模式21.原型模式22.备忘录模式23.享元模式。

niwoxiangyu的博客 715

Go语言常用设计模式

前言 在软件开发中,经常会遇到各种各样的编码场景,这些场景往往重复发生,因此具有典型性。针对这些典型场景,我们可以自己编码解决,也可以采取更为省时省力的方式:直接采用设计模式。 设计模式是啥呢?简单来说,就是将软件开发中需要重复性解决的编码场景,按最佳实践的方式抽象成一个模型,模型描述的解决方法就是设计模式。使用设计模式,可以使代码更易于理解,保证代码的重用性和可靠性。 在软件领域,GoF(四人帮,全拼 Gang of Four)首次系统化提出了 3 大类、共 25 种可复用的经典设计方案,来解决常见的软件

kuokay的博客 2871

Go语言常用的设计模式

本文系统介绍了24种设计模式在Go语言中的实现,分为创建型、结构型、行为型和Go特有模式四类。创建型模式包括单例、工厂方法等6种实例化模式;结构型模式涵盖适配器、装饰器等7种对象组合方式;行为型模式提供责任链、观察者等7种交互模式;特别针对Go语言特性提出函数选项、并发模式等4种特有实现。所有模式均结合Go语言特性(接口、组合、并发)给出具体代码示例和应用场景,并强调Go语言"组合优于继承"的设计哲学,建议根据实际业务需求选择模式,避免过度设计。

qq_44805265的博客 1188

go语言实现装饰器

装饰器作为一种特殊的设计模型,它可以让其他函数在不需要做任何代码修改的前提下增加额外功能,是面向切面编程思想的典型,在日志插入、性能测试、事务处理、缓存、权限校验等场景中应用广泛。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

rip -- shun 550
上一篇: 设计模式go语言实现----桥接模式bridge
下一篇: 设计模式go语言实现----外观模式facade
cloudUncle
博客等级 码龄8年 21粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值