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

news/2025/2/21 7:57:03

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语言中实现时需注意:

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

http://www.niftyadmin.cn/n/5860495.html

相关文章

ESP32系列芯片模组方案,设备物联网无线通信,智能化交互响应控制

在物联网技术飞速发展的今天,芯片模组作为设备连接与智能交互的核心,发挥着至关重要的作用。 ESP32系列芯片模组,凭借其卓越的性能、丰富的功能以及广泛的适用性,在多个领域实现了令人瞩目的落地应用。 ESP32系列芯片模组是一系…

正点原子[第三期]Arm(iMX6U)Linux系统移植和根文件系统构建-5.3 xxx_defconfig过程

前言: 本文是根据哔哩哔哩网站上“arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …

stm32mp集成swupdateOTA升级

在STM32MP257上集成swupdate实现OTA(Over-The-Air)更新需要结合硬件分区管理、系统镜像构建和swupdate配置。以下是具体步骤和关键点: 1. 分区设计与闪存布局调整 STM32MP257的启动流程依赖ROM Code加载FSBL(First Stage Boot Lo…

Java集合框架之ArrayList解析

目录 一、ArrayList概述 二、优缺点分析 三、底层数据结构 四、源码分析ArrayList初始化容量 五、源码分析ArrayList扩容策略 六、ArrayList集合源码分析 1. 属性分析 2. 构造方法分析 无参构造方法 指定初始容量的构造方法 传入集合的构造方法 3. 添加元素 add(E…

测绘未来3-5年的发展

一、行业现状评价 1.1竞争格局多元化 传统测绘企业(如超图软件、航天宏图)与新兴技术企业(如无人机测绘服务商)共同竞争,同时互联网巨头(百度、高德)跨界布局,进一步加剧市场分化。2024年多家头部企业净利润大幅下滑,反映出行业盈利压力与转型紧迫性。 1.2.技术门…

处理哈希冲突

有时候哈希表⽆论选择什么哈希函数都⽆法避免冲突,那么插⼊数据时,如何解决冲突呢?主要两种⽅法,线性探测法和链地址法,这篇先做原理描述,下篇实现代码模拟 一、线性探测 发生冲突的位置开始,依…

常用的性能优化方法和技巧

常用的性能优化方法和技巧 前端性能优化 减少HTTP请求:就好比你去超市买东西,每次请求就像你跑一趟超市。去的次数越多,花在路上的时间就越多。所以把多个小的资源,像图片、脚本这些,合并成一个大的,就能…

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…