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

Golang学习笔记_36——装饰器模式

Golang学习笔记_33——桥接模式
Golang学习笔记_34——组合模式
Golang学习笔记_35——代理模式


文章目录

    • 一、核心概念
      • 1. 定义
      • 2. 解决的问题
      • 3. 核心角色
      • 4. 类图
    • 二、特点分析
    • 三、适用场景
      • 1. 流处理系统
      • 2. GUI组件增强
      • 3. 中间件开发
    • 四、代码示例(Go语言)
    • 五、与其他模式对比
    • 六、总结


一、核心概念

1. 定义

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许在不修改原始对象结构的情况下,通过创建包装对象动态地扩展对象的功能。它通过嵌套组合替代继承,实现功能的灵活叠加。

2. 解决的问题

  • 动态扩展功能:运行时添加/移除对象行为
  • 避免类爆炸:替代多层继承导致的子类膨胀
  • 保持接口一致性:装饰器与原始对象实现相同接口

3. 核心角色

  1. Component(抽象组件)
    定义对象接口(如Coffee接口声明Cost()方法)
  2. ConcreteComponent(具体组件)
    实现基础功能的对象(如原味咖啡)
  3. Decorator(装饰器基类)
    持有组件引用并实现相同接口(可选抽象类)
  4. ConcreteDecorator(具体装饰器)
    添加具体扩展功能(如牛奶、糖装饰器)

4. 类图

装饰器类图

示例类图

二、特点分析

优点

  1. 动态扩展:运行时灵活添加/移除功能
  2. 单一职责:每个装饰器只负责一个功能扩展
  3. 开闭原则:无需修改已有代码即可扩展

缺点

  1. 复杂度增加:多层装饰导致调用链较长
  2. 对象数量膨胀:可能产生大量小对象
  3. 初始化繁琐:需要逐层包装对象

三、适用场景

1. 流处理系统

  • 基础组件:文件流
  • 装饰器:加密流、缓冲流、压缩流
  • 操作:动态组合流处理链(如加密(缓冲(文件流))

2. GUI组件增强

  • 基础组件:文本框
  • 装饰器:边框装饰、滚动条装饰、阴影装饰
  • 操作:动态叠加视觉效果

3. 中间件开发

  • 基础组件:HTTP处理器
  • 装饰器:日志记录、权限校验、缓存处理
  • 操作:按需组合中间件链

四、代码示例(Go语言)

package decoratordemo

import "fmt"

// 抽象组件
type Coffee interface {
   Cost() float64
   Description() string
}

// 具体组件:原味咖啡
type PlainCoffee struct {
}

func (p *PlainCoffee) Cost() float64 {
   return 2.0
}

func (p *PlainCoffee) Description() string {
   return "原味咖啡"
}

// 装饰器基类(可选)
type CoffeeDecorator struct {
   coffee Coffee
}

func (d *CoffeeDecorator) Cost() float64 {
   return d.coffee.Cost()
}

func (d *CoffeeDecorator) Description() string {
   return d.coffee.Description()
}

// 具体装饰器:牛奶
type MilkDecorator struct {
   CoffeeDecorator
}

func (m *MilkDecorator) Cost() float64 {
   return m.CoffeeDecorator.Cost() + 0.5
}

func (m *MilkDecorator) Description() string {
   return m.CoffeeDecorator.Description() + ", 加牛奶"
}

func NewMilkDecorator(coffee Coffee) *MilkDecorator {
   return &MilkDecorator{CoffeeDecorator{coffee}}
}

// 具体装饰器:糖
type SugarDecorator struct {
   CoffeeDecorator
}

func (s *SugarDecorator) Cost() float64 {
   return s.CoffeeDecorator.Cost() + 0.3
}

func (s *SugarDecorator) Description() string {
   return s.CoffeeDecorator.Description() + ", 加糖"
}

func NewSyrupDecorator(coffee Coffee) *SugarDecorator {
   return &SugarDecorator{CoffeeDecorator{coffee}}
}

func test() {
   // 原味咖啡
   coffee := &PlainCoffee{}
   fmt.Printf("%s → $%.2f\n", coffee.Description(), coffee.Cost())

   milkCoffee := NewMilkDecorator(coffee)
   fmt.Printf("%s → $%.2f\n", milkCoffee.Description(), milkCoffee.Cost())

   syrupMilkCoffee := NewSyrupDecorator(milkCoffee)
   fmt.Printf("%s → $%.2f\n", syrupMilkCoffee.Description(), syrupMilkCoffee.Cost())

}

输出结果

=== RUN   Test_test
原味咖啡 → $2.00
原味咖啡, 加牛奶 → $2.50
原味咖啡, 加牛奶, 加糖 → $2.80
--- PASS: Test_test (0.00s)
PASS

五、与其他模式对比

模式核心目标关键区别
适配器接口转换主要解决接口不兼容问题
代理控制访问保持接口相同,增强访问控制
组合处理树形结构关注部分-整体层次结构

六、总结

装饰器模式通过嵌套包装的方式,实现了以下核心价值:

  1. 动态扩展:运行时灵活添加功能
  2. 避免继承:通过组合替代多层继承
  3. 接口透明:客户端无需感知装饰过程

在Go语言中实现时需注意:

  • 利用接口实现多态
  • 通过结构体嵌套实现装饰器链
  • 保持装饰器与原始组件接口一致

相关文章:

  • 臻识相机,华夏相机,芊熠车牌识别相机加密解密
  • 【C++复习专题】—— 类和对象,包含类的引入、访问限定符、类的6个默认成员函数等
  • 通过例子学 rust 个人精简版 5-all
  • 【C语言】指针(5)
  • 小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
  • C++ unordered_map和unordered_set的使用,哈希表的实现
  • One-Prompt-One-Story:无须训练即可保持身份一致性
  • 量子计算的威胁,以及企业可以采取的措施
  • Android Studio SVN下载安装
  • Denoising Diffusion Restoration Models论文解读
  • 解释器vs编译器
  • 前端利器:DateUtils 日期时间工具深度剖析
  • 用openresty和lua实现壁纸投票功能
  • Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境
  • 【AI】VS Code中使用GitHub Copilot
  • 常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper
  • Ext系列文件系统(一)
  • Java 第八章 异常(2)
  • 奇安信春招一面面试题
  • IntelliJ IDEA中Maven配置全指南
  • 手机版网站建设开发/中国时事新闻网
  • 私人做网站有什么用/沧州网站seo
  • 零遁nas做网站/网络营销策划书封面
  • 做网站的论文摘要/网络营销品牌推广
  • jsp网站源码 怎么用/白山网络推广
  • 二维码网站建设源码/seo管理