设计模式: 结构型之装饰器模式(12)

设计模式(八)装饰器模式Decorator(结构型) 设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性。如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上。 通过继承一个现有类可以使得子类在拥有自身方法的同时........................... 阅读详情

装饰器模式概述

  • 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变现有类的情况下,动态地给对象添加新的职责或功能
  • 在 TypeScript 中,装饰器模式可以通过装饰器(Decorators)这一特性来实现
  • 装饰器在 TypeScript 中是一种特殊的声明,它可以附加到类声明、方法、属性或参数上
  • 装饰器使用 @expression 的形式,其中 expression 必须求值为一个函数,该函数将在运行时被调用,并且会被传入有关其装饰的声明的信息
  • 在 TypeScript 中,装饰器主要有四种类型:类装饰器、方法装饰器、属性装饰器和参数装饰器
  • 它们分别用于装饰类、类的方法、类的属性和方法的参数

装饰器模式实现步骤

  • 定义装饰器接口

    • 这个接口定义了需要被装饰的对象应该具有的行为
    • 装饰器接口通常包含一些待实现的方法。
  • 创建装饰器类

    • 这些类实现了装饰器接口,并添加额外的功能或行为
    • 每个装饰器类都包含对原始对象的引用,并在其基础上添加新的功能
  • 应用装饰器

    • 通过 @decoratorName 的形式将装饰器应用到需要被装饰的类、方法、属性或参数上
  • 需要注意的是,装饰器在 TypeScript 中是一个实验性特性

    • 需要在 tsconfig.json 文件中设置 “experimentalDecorators”: true, “emitDecoratorMetadata”: true 才能启用
    • 此外,由于装饰器在编译时会被移除,因此它们主要用于元编程
    • 即在编译时修改类的结构或行为

装饰器的实现

// 首先,我们需要启用装饰器的实验性特性
// 在 tsconfig.json 中添加如下编译选项:
// "experimentalDecorators": true,
// "emitDecoratorMetadata": true

// 定义一个装饰器工厂,用于生成装饰器函数
function timeExecution(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  // 重写方法
  descriptor.value = function (...args: any[]) {
    const startTime = Date.now();
    console.log(`Starting execution of "${propertyKey}"...`);

    try {
      const result = originalMethod.apply(this, args);
      const endTime = Date.now();
      console.log(`Finished execution of "${propertyKey}" in ${(endTime - startTime)}ms.`);
      return result;
    } catch (error) {
      console.error(`Error during execution of "${propertyKey}":`, error);
      throw error;
    }
  };

  return descriptor;
}

// 定义一个普通类
class MyClass {
  @timeExecution
  public doSomethingComplicated(name: string): string | Promise<string> {
    // 模拟耗时操作
    const delay = Math.floor(Math.random() * 1000);
    const result = `Processing ${name} took ${delay}ms.`;
    return new Promise<string>((resolve) => setTimeout(() => resolve(result), delay));
  }
}

// 使用
async function main() {
  const myClass = new MyClass();
  const result = await myClass.doSomethingComplicated("Task");
  console.log(result);
}

main();
  • 在这个例子中,@timeExecution 是一个装饰器,它装饰了 MyClass 类中的 doSomethingComplicated 方法
  • 当调用此方法时,装饰器会捕获开始时间,执行原方法,然后输出方法执行所花费的时间
  • 这种方法增强了 doSomethingComplicated 方法的功能,增加了方法执行时间的追踪,而没有修改原始方法的源代码

装饰器模式的优缺点

  • 装饰器模式是一种结构型设计模式,它允许用户通过动态地给一个对象添加一些额外的职责来增加功能,就增加功能来说,装饰器模式相比生成子类更为灵活。

1 )优点

  • 扩展性强

    • 装饰器模式提供了比继承更有弹性的替代方案
    • 在继承方式中,子类拥有父类的全部行为和状态,这可能导致子类变得相当庞大,且难以管理和维护
    • 而装饰器模式允许用户在不修改原有类的情况下,动态地给对象添加职责,因此更容易扩展
  • 灵活性高

    • 通过组合不同的装饰器,可以实现各种复杂的功能组合,而无需创建大量的子类
    • 这使得代码更加灵活,更易于维护和重用
  • 符合开闭原则

    • 装饰器模式符合开闭原则,即对扩展开放,对修改封闭
    • 这意味着在添加新功能时,无需修改现有代码,只需添加新的装饰器类即可
  • 低耦合度

    • 装饰器模式降低了类之间的耦合度,使得各个类更加独立,更易于测试和调试

2 ) 缺点

  • 可能会产生较多小对象

    • 由于装饰器模式是通过在运行时动态地给对象添加职责来实现的,因此可能会产生较多的装饰器对象。
    • 这可能会增加内存消耗和性能开销。
  • 可能会增加复杂性

    • 如果过度使用装饰器模式,可能会导致代码结构变得复杂,难以理解和维护
    • 特别是当存在多个装饰器且它们的组合方式复杂时,可能会增加理解和调试的难度
  • 可能导致装饰顺序问题

    • 不同的装饰顺序可能会导致不同的行为
    • 因此,在使用装饰器模式时,需要特别注意装饰器的顺序问题,以确保正确实现所需的功能

3 )综上所述

  • 装饰器模式在扩展性和灵活性方面具有优势,但在使用时也需要注意其可能带来的复杂性和性能开销问题
  • 在设计系统时,应根据实际需求权衡利弊,谨慎选择是否使用装饰器模式
保姆级教程:在RK3588开发板上编译带MPP硬件加速的FFmpeg(含完整依赖库配置) 本文提供在RK3588开发板上编译支持MPP硬件加速的FFmpeg的详细教程,涵盖交叉编译环境搭建、MPP框架及依赖库配置,最终实现4K视频硬件编解码性能优化。通过实战步骤和性能对比,展示如何充分发挥RK3588的硬件加速能力。 阅读详情

相关推荐

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1494

设计模式系列(12):结构型模式 - 装饰器模式

在不改变原有对象结构的前提下,动态地给对象添加新的功能。 装饰器模式提供了用组合替代继承的灵活方案。

391

股票分时数据获取-东方财富

获取下股票分时数据,分时均价下线,分时成交额等,用于量化t0交易条件还是很不错了的。

meiaoxue1234的博客 1万+

【c++设计模式12】结构型4:装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变现有对象结构的情况下,动态地将责任(功能)附加到对象上。装饰模式通过以透明的方式扩展对象的功能,比继承更灵活。

junxuezheng的博客 1021

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 927

A*(star)算法原理讲解以及程序实现(基于Python)

本文将以迷宫探索最优路径为例,讲解A *搜索算法原理及其程序实现。在原理讲解部分,首先从为什么要使用A *搜索算法和A *搜索算法的全局最优逻辑出发,讲解A *算法的原理。其次对A *的行动函数g(n)和启发函数h(n)的细节进行了讲解说明,并补充了启发函数的选择对于A *算法的影响。在程序实现部分,首先从程序流程框图出发,解释A *算法的流程。其次按函数的类划分并讲解主要代码,接着展示程序的运行结果,最后对A *算法进行总结分析。

m0_73366745的博客 8285

设计模式--装饰器模式【结构型模式】

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能,而不改变其结构和实现,它在运行时给对象动态地添加一些额外的职责,装饰者模式通过装饰来实现功能的扩展,装饰器的核⼼就是在不改原有类的基础上给类新增功能。我们再次使用车来做为演示的实物载体,生活中我们买了爱车之后,除了 4S 店交付的新车,我们把车开回家之后,还会对车进行一番装饰0例如地垫、儿童座椅、360 安全影像等等,而这些都属于对爱车的装饰,也就是具体的装饰器,而我们的爱车就是抽象组件。

weixin_42118323的博客 2378

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2679

结构型设计模式

结构型设计模式是一种关注怎样组合类和对象以形成更大的结构,同时简化结构间的关系的设计模式。这些模式帮助确保系统部件间的独立性和可维护性。

m0_67550226的博客 2234

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2786

政务帮办新范式:基于检索增强与多智能体协同的智能系统实践

本文提出了一种多智能体协同的智能政务系统架构,突破传统方案在状态管理、职责过载和感知闭环方面的局限。系统由中央规划智能体、对话引导智能体、参数提取智能体和执行状态分析智能体组成,通过职责分离与显式状态管理实现高效协同。核心创新在于中央决策引擎的确定性逻辑,采用基于规则的状态机设计,确保系统可靠可控。该架构支持自然语言交互、参数自动提取、业务系统操作和视觉闭环验证,能够真正实现"帮办"功能,显著提升政务服务的智能化水平。

470

设计模式之装饰器模式

装饰器模式是一种结构型设计模式,它允许我们在不改变原有对象结构的情况下,动态地给对象增加一些职责(即增加其额外功能)。其核心在于通过组合而非继承的方式来扩展对象的功能。Component: 这是抽象组件接口,所有的具体组件和装饰器都必须实现这个接口。Concrete Component: 具体组件,这是我们要装饰的基本对象,它实现了Component接口。Decorator: 抽象装饰器,也是实现Component接口的,它包含一个对Component类型的引用,通常在构造函数中初始化。

丿微风乍起的博客 2305

整理 钢琴 约翰汤普森-简易钢琴(小汤)

文件名:(小汤1)约翰-汤普森钢琴1 超清PDF (原版引进)文件名:(小汤2)约翰-汤普森钢琴2 超清PDF (原版引进)文件名:(小汤3)约翰-汤普森钢琴3 超清PDF (原版引进)文件名:(小汤4)约翰-汤普森钢琴4 超清PDF (原版引进)文件名:(小汤5)约翰-汤普森钢琴5 超清PDF (原版引进)文件大小:20.1 MB。文件大小:23.7 MB。文件大小:45.7 MB。文件大小:51.7 MB。文件大小:72.0 MB。

TS的博客 5万+

【设计模式】结构型模式(一):适配器模式、装饰器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是通过适配器将一个接口转换为客户端所期望的另一个接口。这个模式允许你为现有类增加新功能,或者让它们之间兼容,而无需修改其源代码。

Data · Model · Agent · Repeat 1465

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

不得不说的结构型模式-装饰器模式

设计模式之装饰器模式,不得不会的知识

clayhell的博客 1517

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java设计模式之一:装饰器模式

Java设计模式之一:装饰器模式

杨荧的优快云博客 3055

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

结构型设计模式之装饰器模式【设计模式系列】

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。在不想增加很多子类的情况下扩展类。将具体功能职责划分,同时继承装饰者模式。图1_1 装饰器模式类图装饰模式的特点:装饰对象和真实对象有相同的接口。客户端对象可以使用和真实对象相同的方式和装饰对象交互。装饰对象包含一个真实对象的索引(reference)

weixin_30197685的博客 1581

【Java 设计模式】结构型之装饰器模式

装饰器模式是一种结构型设计模式,它允许在不改变对象接口的情况下,动态地将责任附加到对象上。装饰器模式通过创建一个包装对象(装饰器)来实现,这个包装对象包含了原始对象,并在原始对象的基础上添加了新的功能。装饰器模式通常包含四个主要角色:抽象组件(Component)、具体组件(ConcreteComponent)、抽象装饰器(Decorator)和具体装饰器(ConcreteDecorator)。定义了被装饰对象的接口实现了抽象组件接口,是被装饰的具体对象继承自抽象组件,并包含一个指向抽象组件的引用。

好久不见的流星 1471

C#设计模式之【结构型设计模式:装饰器模式】

C#设计模式之【结构型设计模式:装饰器模式】一.装饰器模式简述二.代码示例三.总结 一.装饰器模式简述   概念: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。   就增加功能而言,装饰器模式比直接生成子类更加灵活。装饰器模式使用继承+组合的方式解决问题。   下面我们以给汽车改装的例子进行代码示例,假如我新买了一部奥迪A8,我想给它进行改装发动机(必选项,先改装),改轮毂、车身喷漆、改排

qq_33101689的博客 448

结构型设计模式:装饰器模式

这些组件可能只是完成一些核心功能。但在。

weixin_44477424的博客 506

设计模式(十)结构型:装饰器模式详解

装饰器模式(Decorator Pattern)是 GoF 23 种设计模式中的结构型模式之一,其核心价值在于动态地为对象添加额外的职责或功能,而无需通过继承来扩展类。

谦与谦寻的神隐 927

设计模式-结构型-装饰器模式

装饰器模式是一种强大的设计模式,提供了一种灵活的方式来扩展对象的功能。通过将对象封装在另一个对象中,装饰器可以在不修改原始对象的情况下,为对象添加新的行为。这种模式使得我们可以通过组合多个装饰器来动态增加功能,而避免了类继承的复杂性,符合“开闭原则”。装饰器模式(Decorator Pattern)是结构型设计模式中的一种,它允许你通过将对象封装在一个新的对象中,来动态地添加新的功能,而无需改变原对象的结构。装饰器模式在许多实际应用中都有广泛的使用,特别是在需要动态增强对象功能的场景中。

游客520 1248

C++设计模式之结构型模式:装饰器模式(Decorator)

装饰器模式是一种动态扩展对象功能的结构型设计模式,通过组合而非继承的方式实现功能叠加。其核心包含抽象组件、具体组件、抽象装饰器和具体装饰器四个角色,允许在不修改原有对象结构的情况下灵活添加功能。典型应用场景如咖啡订单系统,通过嵌套装饰器实现配料组合。该模式优势在于避免类爆炸、符合单一职责原则,支持运行时动态扩展。与适配器、代理等模式不同,装饰器专注于透明地扩展功能而非接口转换或访问控制。使用时需注意保持接口一致、合理管理内存,适用于需要灵活组合功能的场景。

bkspiderx的博客 1183

【设计模式-3.5】结构型——装饰器模式

【设计模式-3.5】结构型——装饰器模式

小何的博客 1220

设计模式:结构型-装饰器模式

目录第一章 装饰器模式介绍第二章 装饰器模式实现2.1、关系依赖图2.2、图形接口类2.3、图形实现类2.4、图形修饰者接口类2.5、图形修饰者实现类2.6、最终测试类第三章 装饰器模式应用 第一章 装饰器模式介绍 装饰器模式的介绍: 在软件开发过程中,有时想用一些现存的组件,这些组件可能只是完成了一些核心功能,但在不改变其结构的情况下,可以动态地扩展其功能,所有这些都可以釆用装饰器模式来实现。装饰器模式(Decorator Pattern)的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职

轻松的小希 1614

设计模式 - 结构型模式_装饰器模式

装饰器的核⼼就是再不改原有类的基础上给类新增功能。不改变原有类,大家会想到继承、AOP切⾯,当然这些⽅式都可以实现,但是使⽤装饰器模式会是另外⼀种思路更为灵活,可以避免继承导致的⼦类过多,也可以避免AOP带来的复杂性。很多场景⽤到装饰器模式字节流、字符流、⽂件流的内容时都⻅到了这样的代码,⼀层嵌套⼀层,⼀层嵌套⼀层,字节流转字符流等等,⽽这样⽅式的使⽤就是装饰器模式的⼀种体现。

小工匠 2万+
上一篇: 设计模式: 结构型之外观模式(11)
下一篇: 设计模式: 行为型之备忘录模式(13)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值