%% # 纲要 > 主干纲要、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