%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
%%
# 装饰器模式(Decorator)
![[_attachment/02-开发笔记/16-设计模式/装饰器模式.assets/IMG-装饰器模式-5EE561F998BD607735BF37BDFF5E070C.png|639]]
装饰器模式是一种**结构型设计模式**,允许在不修改现有代码的情况下,通过**外套多个装饰器对象**来动态扩展对象的功能。
装饰器模式的构成:
- **抽象组件类**:定义组件的**公共 "接口"**,**所有 "可被装饰" 的对象**必须实现该接口。
- **具体组件类**:实现组件接口,且可**扩展添加额外行为**
- **抽象装饰器类**:**继承自抽象组件**,同时持有一个对 "**==抽象组件类==**" 的引用,可在其基础上扩展行为。
- **具体装饰器类**:实现装饰器接口,并添加额外行为。
> [!summary]
>
> - "**抽象组件类**" 定义了通用接口,**所有 "==可被装饰==" 的对象**必须实现该接口。
> - "**抽象装饰器类**"
> - 本身 **==继承==** 自 "**抽象组件类**",具有与 "被装饰对象(组件)" 相同的接口。
> - 同时又持有对 "**抽象组件类**" 的引用,故该引用可以基于 "**==多态==**" 在运行时指向 "**具体组件类**" 或者 "**具体装饰器类**"。
>
> 由于 **"装饰器类" 实现了与 "组件类" 相同的接口**,因此从外部上下文中代码视角来看,并**不区分 "原始组件对象" or "装饰后的对象"**,外部代码与二者的交互行为是完全相同的。
<br>
### 装饰器模式类图
![[_attachment/02-开发笔记/16-设计模式/装饰器模式.assets/IMG-装饰器模式-1C146806B69E159EC5BB9E0BB230F19A.png|711]]
### 使用建议
**装饰器**适用于需针对 "**抽象组件**" 进行编码的场景,如果需要针对 "**具体组件**" 编码(代码依赖于 **==特定的具体组件类型==**),则不适用 "装饰器"。
![[_attachment/02-开发笔记/16-设计模式/装饰器模式.assets/IMG-装饰器模式-3DB6ADF449A6EF0517AAEA1DB8C527CE.png|500]]
## 优缺点
优点:
- 无需创建新子类即可扩展对象的行为。
- 可以**在运行时添加或删除对象的功能**。
- 可以用**多个装饰封装对象**来组合几种行为。
缺点:
- 在装饰器栈中**删除特定装饰器**比较困难。
- 实现行为**不受装饰栈顺序影响的装饰**比较困难
<br><br>
# 示例场景
![[_attachment/02-开发笔记/16-设计模式/装饰器模式.assets/IMG-装饰器模式-A38AF328358653F35E046AB65AACA732.png|574]]
![[_attachment/02-开发笔记/16-设计模式/装饰器模式.assets/IMG-装饰器模式-00030BE0AB8F7B43CCA1F2F103C85BB8.png|590]]
<br><br>
# 参考资料
# Footnotes