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

目录

 装饰器模式是什么

下面是装饰器模式的一个通用的类图:

以下是使用C++实现装饰器模式的示例代码:

下面是面试中关于桥接器模式的常见的问题:

下面是问题的答案:


 装饰器模式是什么

装饰器模式是一种结构型设计模式,它允许在运行时动态地添加或修改对象的功能,而无需改变其原始类。在这个模式中,使用一个装饰器类来包装原始类,并且这个装饰器类和原始类具有相同的接口,这样就可以透明地将新的功能添加到原始对象中,而不需要修改原始对象的代码。

下面是装饰器模式的一个通用的类图:

以下是使用C++实现装饰器模式的示例代码:

#include <iostream>
using namespace std;

// 基础组件类
class Component {
public:
    virtual void operation() = 0;
};

// 具体组件类
class ConcreteComponent : public Component {
public:
    void operation() {
        cout << "ConcreteComponent operation." << endl;
    }
};

// 装饰器基类
class Decorator : public Component {
protected:
    Component* component;  // 指向被装饰对象的指针
public:
    Decorator(Component* comp) {
        component = comp;
    }
    void operation() {
        component->operation();
    }
};

// 具体装饰器类A
class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(Component* comp) : Decorator(comp) {}
    void operation() {
        Decorator::operation();
        cout << "ConcreteDecoratorA operation." << endl;
    }
};

// 具体装饰器类B
class ConcreteDecoratorB : public Decorator {
public:
    ConcreteDecoratorB(Component* comp) : Decorator(comp) {}
    void operation() {
        Decorator::operation();
        cout << "ConcreteDecoratorB operation." << endl;
    }
};

int main() {
    Component* comp = new ConcreteComponent();
    comp->operation();

    Component* dec1 = new ConcreteDecoratorA(comp);
    dec1->operation();

    Component* dec2 = new ConcreteDecoratorB(dec1);
    dec2->operation();

    delete comp;
    delete dec1;
    delete dec2;

    return 0;
}

在这个示例中,基础组件类Component定义了一个纯虚函数operation(),表示组件的操作。具体组件类ConcreteComponent实现了Component接口,并且实现了具体的操作。

装饰器基类Decorator也继承了Component接口,并且包含一个指向被装饰对象的指针component,它的实现中调用了被装饰对象的operation()方法。具体装饰器类ConcreteDecoratorAConcreteDecoratorB分别继承了Decorator,并且在调用被装饰对象的operation()方法之后,添加了自己的操作。

main()函数中,首先创建了一个具体组件对象comp,然后使用具体装饰器类ConcreteDecoratorAConcreteDecoratorB对其进行装饰,并且调用了它们的operation()方法。在运行时,将看到输出如下:

ConcreteComponent operation.
ConcreteComponent operation.
ConcreteDecoratorA operation.
ConcreteDecoratorB operation.

在这个示例中,我们可以看到装饰器模式的实际应用。在不改变原始对象的情况下,可以通过添加一个或多个装饰器对象,来扩展原始对象的功能。这种方式非常灵活,因为可以在运行时动态地添加或删除装饰器对象,从而达到不同的效果。

下面是面试中关于装饰器模式的常见的问题:

  1. 你认为装饰器模式是什么?它的作用是什么?

  2. 装饰器模式与继承有什么区别?你能给出一个例子说明这两种方法的区别吗?

  3. 装饰器模式中的四个角色分别是什么?它们各自的作用是什么?

  4. 你是否在实际项目中使用过装饰器模式?可以分享一下你的经验吗?

  5. 装饰器模式的优缺点是什么?你认为在哪些场景下可以使用装饰器模式?

可以尝试自己思考一下,你的看法是什么,然后再看看答案,对比一下,看看有什么遗漏的地方=v=.

下面是问题的答案:

  1. 装饰器模式是一种结构型设计模式,它允许在运行时动态地添加或删除对象的行为,而不需要修改其源代码。它的作用是通过包装原始对象来扩展其功能,从而使代码更加灵活和易于维护。

  2. 装饰器模式通过包装原始对象来扩展其功能,而不需要修改其源代码。而继承则是通过创建子类来扩展父类的功能。装饰器模式具有更高的灵活性,可以在运行时动态添加或删除对象的行为,而继承则需要在编译时确定子类的行为。例如,如果要为一个类添加新的行为,使用继承需要创建一个新的子类来扩展父类的功能,而使用装饰器模式可以在运行时动态添加新的行为。

  3. 装饰器模式中的四个角色分别是:抽象组件(Component)、具体组件(ConcreteComponent)、抽象装饰器(Decorator)和具体装饰器(ConcreteDecorator)。其中,抽象组件定义了对象的基本行为,具体组件是实现抽象组件接口的类,抽象装饰器是所有装饰器的基类,具体装饰器是实现抽象装饰器接口的类。

  4. 在实际项目中,我曾经使用装饰器模式来扩展一个电商平台的订单处理系统。由于平台的订单类型非常多,而且不断有新的订单类型出现,为了保证代码的灵活性和可扩展性,我们使用装饰器模式来动态地添加或删除订单的行为,从而满足不同类型订单的需求。

  5. 装饰器模式的优点是可以在运行时动态地添加或删除对象的行为,从而使代码更加灵活和易于维护。它还遵循了开放封闭原则,即对扩展开放,对修改关闭。同时,装饰器模式还可以避免类爆炸问题,即避免创建大量的子类来扩展对象的行为。

    然而,装饰器模式也有一些缺点。首先,它可能会导致过度使用装饰器,从而导致代码的复杂性和可读性降低。其次,由于装饰器模式增加了许多小类,因此它可能会导致代码库的大小增加。此外,装饰器模式还可能影响程序的性能,因为它需要在运行时动态地创建和组合对象。

    总之,装饰器模式是一种非常有用的设计模式,可以帮助我们扩展对象的功能,从而使代码更加灵活和易于维护。它的应用场景包括但不限于:需要动态地添加或删除对象的行为,需要避免类爆炸问题,需要遵循开放封闭原则等。

欢迎大家讨论留言,批评指正,共同学习,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机怎么看生产日期?参考方法在这!

案例&#xff1a;怎么查苹果手机买了几年&#xff1f; 【求助&#xff01;我从别人那里买了一部苹果手机&#xff08;非官方&#xff09;&#xff0c;怎么看这个手机用了几年&#xff1f;】 苹果手机作为一款高端手机&#xff0c;备受用户的喜爱。然而&#xff0c;许多用户不知…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取每张图像的微秒时间和FrameID(C#)

BGAPI SDK获取图像微秒级时间和FrameID Baumer工业相机Baumer工业相机FrameID技术背景一、FrameID是什么&#xff1f;二、使用BGAPI SDK获取图像微秒时间和FrameID步骤 1.获取SDK图像微秒级时间2.获取SDK图像FrameIDBaumer工业相机使用微秒级时间和FrameID保存的用处Baumer工业…

全网唯一!Matlab世界顶尖艺术品配色包Rmetbrewer

想要绘制一幅颜色搭配合理、好看又不花哨的论文插图&#xff0c;该如何操作呢&#xff1f; 正所谓求其上者得其中&#xff0c;求其中者得其下。 那么&#xff0c;向高手借鉴思路&#xff0c;无疑是一种不落下乘的好策略。 而在色彩搭配领域&#xff0c;像莫奈、梵高这些世界…

操作系统原理 —— 进程有哪几种状态?状态之间如何切换?(七)

进程的五种状态 首先我们一起来看一下进程在哪些情况下&#xff0c;会有不同的状态表示。 创建态、就绪态 当我们刚开始运行程序的时候&#xff0c;操作系统把可执行文件加载到内存的时候&#xff0c;进程正在被创建的时候&#xff0c;它的状态是创建态&#xff0c;在这个阶…

三菱GX Works2梯形图程序分段显示设置的具体方法示例

三菱GX Works2梯形图程序分段显示设置的具体方法示例 大家平时在使用GX Works2进行梯形图程序编辑时,默认是一整段在一起,程序步数较多时查看起来不是那么方便,下面就和大家分享如何通过声明编辑来实现程序分段显示。 具体方法可参考以下内容: 如下图所示,打开GX Works2编…

DATAFAKER 使用方法记录

DATAFAKER 使用方法记录 win10 64位 Python 3.10.11 参考网址 datafaker的使用–详细教程 https://blog.csdn.net/A15517340610/article/details/105623103 https://github.com/gangly/datafaker python 版本 It is compatible with python2.7 and python3.4 也就是说 他…

案例2:Java图书商城系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

使用nginx做WSS转为WS

HTTPS 是一种加密文本的超链接&#xff0c;所以需要证书&#xff0c;证书可以 使用域名&#xff0c;在腾讯云等服务商申请 https 证书&#xff0c;证书有 收费的和免费的&#xff0c;免费的有使用期限。 利用域名申请证书后&#xff0c;一般会有4中证书文件&#xff0c; .csr…

【Vue 基础】尚品汇项目-02-路由组件的搭建

项目路由说明&#xff1a; 前端的路由&#xff1a;Key-Value键值对 Key&#xff1a;URL&#xff08;地址栏中的路径&#xff09; Value&#xff1a;相应的路由组件 作用&#xff1a;设定访问路径&#xff0c;并将路径和组件映射起来&#xff08;就是用于局部刷新页面&#xff0…

前有谷歌的“生存指南”,后有金山系的“表格编程”,均登热榜

谷歌的“生存指南” 一位曾经在谷歌工作的工程师&#xff0c;干了一件了不起的事&#xff0c;花费了两年的时间&#xff0c;整理了一份“xg2xg”的清单。 原来这位离职的谷歌工程师为程序员编写了一份“厂外生存指南”&#xff0c;即使你从谷歌离职后&#xff0c;在这套“生存…

AlgoC++第六课:BP反向传播算法

目录 BP反向传播算法前言1. MNIST2. 感知机2.1 前言2.2 感知机-矩阵表示2.3 感知机-矩阵表示-多个样本2.4 感知机-增加偏置2.5 感知机-多个输出2.6 总结2.7 关于广播 3. BP4. 动量SGD5. BP示例代码总结 BP反向传播算法 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xf…

【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解

引言 Vue 3 的虚拟 DOM 是一种用于优化 Vue 应用程序性能的技术。它通过将组件实例转换为虚拟 DOM&#xff0c;并在组件更新时递归地更新虚拟 DOM&#xff0c;以达到高效的渲染性能。在 Vue 3 中&#xff0c;虚拟 DOM 树由 VNode 组成&#xff0c;VNode 是虚拟 DOM 的基本单元…

新黑马头条项目经验(黑马)

swagger (1)简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接…

HCIP之RSTP、MSTP

目录 RSTP 相较于802.1D改进 改进1&#xff1a;变更了端口角色 改进点2&#xff1a;修改了端口的状态类型 改进3&#xff1a;对配置BPDU的报文内容进行修改 改进点4&#xff1a;对配置BPDU的处理 改进点5&#xff1a;快速收敛机制 改进点6&#xff1a;拓扑变更机制的改进…

学电路设计时,你遇到过什么有趣的事?

说几个学生时代的傻x事&#xff1a; 1、以前对DC-DC懂得少&#xff0c;而且一般开关电源芯片小&#xff0c;还有一堆外围&#xff0c;手焊很麻烦&#xff0c;就觉得三端稳压器碉堡了啊&#xff0c;一个就能得到想要的电压啊&#xff0c;有木有。然后就各种用三端稳压器。那玩意…

无源滤波器为什么能滤波?

滤波器能够滤波的本质是利用构造特定的阻抗特性引起反射和损耗来实现对频率的选择。 如果从能量守恒的角度来讲&#xff0c;被抑制掉的信号去哪里了&#xff1f;​ 我们先看一下基本电路原理&#xff0c;上图中&#xff0c;负载接收的功率为 我们知道&#xff0c;最大功率传输…

【大数据之Hadoop】十八、MapReduce之压缩

1 概述 优点&#xff1a;减少磁盘IO、减少磁盘存储空间。 缺点&#xff1a;因为压缩解压缩都需要cpu处理&#xff0c;所以增加CPU开销。 原则&#xff1a;运算密集型的Job&#xff0c;少用压缩&#xff1b;IO密集型的Job&#xff0c;多用压缩。 2 压缩算法对比 压缩方式选择时…

广州蓝景分享—快速了解Typescript 5.0 中重要的新功能

作为一种在开发人员中越来越受欢迎的编程语言&#xff0c;TypeScript 不断发展&#xff0c;带来了大量的改进和新功能。在本文中&#xff0c;我们将深入研究 TypeScript 的最新迭代版本 5.0&#xff0c;并探索其最值得注意的更新。 1.装饰器 TypeScript 5.0 引入了改进的装饰…

AI绘画——Checkpoint模型Dark Sushi Mix 大颗寿司Mix

目录 版本解析 模型简介 模型特性 模型演示&#xff08;多图预警&#xff09; Picture One 正面tag&#xff1a; 负面tag&#xff1a; Checkpoint模型darkSushiMixMix无Vae Checkpoint模型darkSushiMixMixVae模型kl-f8-anime2.ckpt Picture Two 正面tag&#xff1a;…

什么是OADM光分插复用器

文章导读&#xff1a; 什么是OADM光分插复用器 光分插复用器的功能 光分插复用器的类型&#xff08;FOADM, TOADM&#xff09; OADM的应用 1、什么是OADM光分插复用器 由不同的光通道进出单模光纤。 它的主要功能是在不影响其他波长信道传输的情况下&#xff0c;选择性地下载或…