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

【设计模式】第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.lryc.cn/news/214393.html

相关文章:

  • Spire.doc读取模板文档,并在书签处插入内容
  • 性能测试实施流程,5个阶段给老板安排的明明白白!
  • 【教程】R语言生物群落(生态)数据统计分析与绘图
  • 数据库-用户权限管理
  • 十一、W5100S/W5500+RP2040树莓派Pico<ARP 地址解析>
  • 可以直接在线制作电子画册的网站
  • SortableJS:vuedraggable实现元素拖放排序
  • 跟着Nature Communications学作图:纹理柱状图+添加显著性标签!
  • 88. 合并两个有序数组、Leetcode的Python实现
  • 视频列表:点击某个视频进行播放,其余视频全部暂停(同时只播放一个视频)
  • 论文-分布式-共识,事务以及两阶段提交的历史描述
  • [100天算法】-二叉树剪枝(day 48)
  • 常用编程语言排行与应用场景汇总(2023.10)
  • 基于 MySQL 多通道主主复制的机房容灾方案
  • 视频汇聚平台EasyCVR分发的流如何进行token鉴权?具体步骤是什么?
  • B-5:网络安全事件响应
  • 第17期 | GPTSecurity周报
  • 透视俄乌网络战之五:俄乌网络战的总结
  • 深度学习之基于Pytorch卷积神经网络的图像分类系统
  • 外观专利怎么申请?申请外观专利需要的资料有哪些?
  • 【Amazon】跨AWS账号资源授权存取访问
  • 探索C++中的不变之美:const与构造函数的深度剖析
  • DDoS类型攻击对企业造成的危害
  • 深入理解JVM虚拟机第十五篇:虚拟机栈常见异常以及如何设置虚拟机栈的大小
  • Rocketmq5延时消息最大时间
  • uniapp @click点击事件在新版chrome浏览器点击没反应
  • beanDefinition读取器
  • linux 上flink单机安装详解
  • 数据链路层中存在的报文ip,arp,rarp
  • 【Tricks】PC端微信输入时,文本出现右对齐情况怎么恢复