当前位置: 首页 > 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())
}
http://www.lryc.cn/news/259843.html

相关文章:

  • 全志V3s之U-Boot
  • 【华为OD】依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列
  • CentOS 7.9安装宝塔面板,安装gitlab服务器
  • AutoGen多代理对话项目示例和工作流程分析
  • 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测
  • 使用高防IP防护有哪些优势
  • android-xml语法
  • 【银行测试】第三方支付平台业务流,功能/性能/安全测试方法...
  • 全志V3s之显示当前文件路径
  • 小程序跳转tabbar,tabbar页面不刷新
  • 在SpringData JPA 中实现对持久层的操作
  • C++ SEH结构化异常捕获处理(双平台支持 Linux、Windows)。
  • jvm-sandbox-repeater 精简版部署之standalone模式
  • 【JavaWeb笔记】单选框,结合Servlet
  • Docker 与 Podman:揭示容器编排的最佳 25 大常见问题解答
  • Spark分布式内存计算框架
  • 安装python第三方库后,在pycharm中不能正常导入
  • 从“食”到“用”,燕之屋的未来增长价值几何?
  • C++使用策略模式,减少使用switch...case...
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • 2024 年,新程序员如何与AI共赢!!
  • Debian 系统镜像下载
  • 数据结构和算法(全)
  • Vue项目中WebSocket封装
  • 018 OpenCV 人脸检测
  • Etcd实战(一)-部署etcd集群
  • Python绘制一个简单的圣诞树
  • 【CANoe】CANoe中使用RS232
  • Springboot内置Tomcat线程数优化
  • vue+django 开发环境跨域前后端联调配置