TypeScript 设计模式之【装饰模式】

devtools/2024/10/18 7:57:27/

文章目录

  • **装饰模式**:为你的对象穿上华丽的外衣
  • 装饰者的魔法
    • 装饰模式有什么利与害?
    • 如何使用装饰者来美化你的对象
    • 代码实现案例
    • 装饰模式的主要优点
    • 装饰模式的主要缺点
    • 装饰模式的适用场景
    • 总结

在这里插入图片描述

装饰模式:为你的对象穿上华丽的外衣

嘿程序员,你有一件普通格子衬衫,它很舒适,但有时候你可能想让它看起来更特别一些。你可以给它加上一些别针、徽章或者刺绣,让它变得与众不同。

这就像是在编程中使用装饰模式,你可以在不改变原始对象的情况下,为它添加新的功能或者修改它的行为。装饰模式就像是一位时尚设计师,能够为你的对象设计出各种华丽的"外衣"!

在这里插入图片描述

装饰者的魔法

装饰模式就像是给你的对象穿上一层又一层的"衣服",每一层都可以添加新的功能或者修改现有的行为,而且你可以随时添加或移除这些"衣服",非常灵活。

装饰模式有什么利与害?

装饰模式的优点是它可以在不修改原始代码的情况下扩展对象的功能,就像你可以给衬衫添加各种装饰而不需要改变衬衫本身。它遵循开闭原则,对扩展开放,对修改关闭。缺点是如果过度使用,会导致代码中出现大量小对象,使系统变得复杂难懂。

如何使用装饰者来美化你的对象

装饰涉及角色

  • 组件(Component):定义可以动态添加职责的对象的接口

  • 具体组件(ConcreteComponent):定义可以添加额外职责的对象

  • 装饰(Decorator):维持一个指向Component对象的引用,并定义一个与Component接口一致的接口。

  • 具体装饰(ConcreteDecorator):向组件添加职责。

装饰步骤

  1. 创建一个基础组件接口

  2. 实现具体的基础组件

  3. 创建一个装饰器基类,实现了组件接口并包含一个组件引用

  4. 创建具体的装饰器类,继承自装饰器基类并添加新的行为

  5. 使用这些装饰器来包装组件,从而动态地添加新的功能

选择合适的装饰器,你就能轻松地为你的对象添加各种功能,让它变得更加强大和灵活!

代码实现案例

typescript">// 组件接口-衬衫
interface Shirt {// 获取外表   getDescription(): string;// 获取成本getCost(): number;
}// 具体组件-普通衬衫
class BasicShirt implements Shirt {getDescription(): string {return "普通格子衬衫";}getCost(): number {return 100;}
}// 装饰器基类
abstract class ShirtDecorator implements Shirt {protected shirt: Shirt;constructor(shirt: Shirt) {this.shirt = shirt;}getDescription(): string {return this.shirt.getDescription();}getCost(): number {return this.shirt.getCost();}
}// 具体装饰器:别针
class PinDecorator extends ShirtDecorator {getDescription(): string {return `${this.shirt.getDescription()}, 加上别针`;}getCost(): number {return this.shirt.getCost() + 20;}
}// 具体装饰器:徽章
class BadgeDecorator extends ShirtDecorator {getDescription(): string {return `${this.shirt.getDescription()}, 加上徽章`;}getCost(): number {return this.shirt.getCost() + 15;}
}// 具体装饰器:刺绣
class EmbroideryDecorator extends ShirtDecorator {getDescription(): string {return `${this.shirt.getDescription()}, 加上刺绣`;}getCost(): number {return this.shirt.getCost() + 50;}
}// 使用装饰器
let shirt: Shirt = new BasicShirt();
console.log(shirt.getDescription()); // 输出: 普通格子衬衫
console.log(shirt.getCost()); // 输出: 100shirt = new PinDecorator(shirt);
console.log(shirt.getDescription()); // 输出: 普通格子衬衫, 加上别针
console.log(shirt.getCost()); // 输出: 120shirt = new BadgeDecorator(shirt);
console.log(shirt.getDescription()); // 输出: 普通格子衬衫, 加上别针, 加上徽章
console.log(shirt.getCost()); // 输出: 135shirt = new EmbroideryDecorator(shirt);
console.log(shirt.getDescription()); // 输出: 普通格子衬衫, 加上别针, 加上徽章, 加上刺绣
console.log(shirt.getCost()); // 输出: 185

在这里插入图片描述

装饰模式的主要优点

  1. 灵活性强:通过组合不同的装饰器来创建各种不同的行为

  2. 遵循开闭原则:在不修改现有代码的情况下添加新的功能

  3. 比继承更加灵活:动态地添加或删除职责,而不是在编译时就确定

  4. 支持递归组合:用多个装饰器包装一个组件

装饰模式的主要缺点

  1. 可能会创建很多小对象:每个装饰器都是一个新的对象,如果过度使用可能会导致系统变得复杂。
  2. 装饰层次增多时会更复杂:如果有太多的装饰类,或许会让系统变得难以理解和维护
  3. 可能会导致错误配置:由于可以动态地添加装饰器,或许会因为错误的配置导致意外的行为

装饰模式的适用场景

  1. 需要在运行时动态地给对象添加额外的职责,而不希望改变原有对象的结构
  2. 希望通过组合而不是继承来扩展对象的功能
  3. 系统中有大量独立的扩展,为支持每种组合将产生大量的子类,使得子类数目呈爆炸性增长。

总结

装饰模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。这种模式在不修改现有对象结构的情况下动态地扩展对象的功能,它具有很强的灵活性和可扩展性,但也会导致系统中出现大量小对象。合理使用装饰模式,可以让你的代码更加灵活,更易于维护和扩展。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告:TypeScript 设计模式之【外观模式】


http://www.ppmy.cn/devtools/117905.html

相关文章

学习C++的第七天!

1.虚函数是在基类中用 virtual 关键字声明的函数,可以在派生类中被重写。纯虚函数是在虚函数的基础上,在基类中被初始化为 0 的函数,含有纯虚函数的类是抽象类,不能被实例化。 2.如果基类的析构函数不是虚函数,当通过…

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能&#xff0c;在ElementUI的 <el-upload> 组件的基础装封装了 /components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造&#xff0c;将图片的信息在上传之前处理成 base64 格式&am…

基于matlab语音滤波系统

实验目的 1、学会MATLAB的使用&#xff0c;掌握其程序设计方法&#xff0c;学会对信号进行分析和处理&#xff1b; 2、掌握语音信号的采集、存储和时频分析&#xff1b; 3、要求掌握IIR数字滤波器的设计原理、设计方法和设计步骤&#xff1b; 4、学习用窗函数法设计FIR数字…

【Linux实践】实验七:vi编辑器的使用

【Linux实践】实验七&#xff1a;vi编辑器的使用 实验目的实验内容实验步骤及结果1. 挂载磁盘2. vi编辑器3. 使用 vi 创建文件4. 扩展功能 实验目的 7、掌握挂载和卸载文件系统的方法。 8、掌握vi编辑器的使用方法。 实验内容 1、使用命令挂载U盘&#xff0c;并能正确显示U盘…

【Python报错已解决】TypeError: tuple indices must be integers or slices, not str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

打造同城O2O平台:外卖跑腿APP的架构与功能设计详解

今天&#xff0c;小编将于大家共同讨论外卖跑腿APP的架构设计及其核心功能&#xff0c;旨在为开发者提供一份详尽的参考。 一、外卖跑腿APP的架构设计 1.整体架构概述 通常包括前端、后端和数据库。 2.前端设计 用户端提供直观的界面&#xff0c;方便用户下单、查询订单状态…

20240927 每日AI必读资讯

猛了&#xff01;Meta震撼发布 Llama 3.2 视觉方面吊打所有闭源模型? - 性能与GPT4o-mini 相当 能够在边缘设备上高效运行 - Llama 3.2包括适用于边缘和移动设备的小型和中型视觉大语言模型&#xff08;11B 和 90B&#xff09;以及轻量文本模型&#xff08;1B 和 3B&#xf…

数学符号练习篇-函数

前言 其实主要的目的是可以在文本中输出各种数学符号&#xff0c;便于以后用到的时候有现成的例子拿过来抄~~ 函数的定义 量和量之间的关系:如 A π R 2 AπR^2 AπR2 y f ( x ) yf(x) yf(x) 中 f f f为函数&#xff0c; x x x为自变量&#xff0c; y y y因变量出 函数在…