【C++】—— 装饰器模式

目录

(一)什么是装饰器模式

(二)为什么要使用装饰器模式

(三)装饰器模式的实现步奏

 (四)代码示例

(五)装饰器模式优缺点


(一)什么是装饰器模式

装饰模式(Decorator Pattern),也被称为包装模式,是一种通过对客户端透明的方式来扩展对象功能的设计模式,它提供了一种替代继承关系的方案。装饰模式通过将要添加的附加功能放在独立的类中,并让这个类包含要装饰的对象,实现了在运行时动态地给对象添加功能的能力。

在装饰模式中,抽象构件定义了对象的接口,具体构件是被装饰的对象,装饰者持有一个构件对象的引用,并定义与抽象构件一致的接口。装饰者可以在调用构建对象的方法前后添加额外的行为,从而扩展对象的功能。

通过使用装饰模式,我们可以灵活地在运行时动态地给对象添加功能,而无需改变原有类的结构。客户端可以按照需要选择、按顺序使用不同的装饰者来包装对象,从而达到组合各种功能的目的。这种方式实现了功能的扩展和复用,同时也避免了使用继承带来的静态特性和多个子类的维护问题。


(二)为什么要使用装饰器模式

  1. 装饰模式可以动态的给一个对象添加一 些额外的职责。
  2. 就增加功能来说,此模式比生成子类更为灵活,通过子类继承的方式,但是如果后续继续增加功能的话,便要继续继承现有的类,如此就会使继承的层次越来越深,不利与代码的维护和可读性。
  3. 故最好的方式便是通过装饰者模式来完成。

(三)装饰器模式的实现步奏

  • 提供一个抽象组件类:抽象被装饰者的行为
  • 提供一个或多个具体组件类:被装饰者的行为具体实现
  • 提供一个抽象装饰器类:抽象组件指针与抽象组件一致接口
  • 提供一个具体的装饰器类:为具体组件附加责任


 (四)代码示例

场景

  • 对于一些职场人士在出席一些重要场合的时候,大部分都是西装革履的。因此,我在这里就模拟男士穿衣的场景

首先,定义一个抽象基类Boy代表男生;

class Boy {
public:
    virtual void wearClothes() = 0;
};

接下来,创建具体的男生类;

class ConcreteBoy : public Boy {
public:
    void wearClothes() override {
        cout << "首先穿上打底衫" << endl;
    }
};

 然后,定义装饰器基类;

class Decorator : public Boy {
protected:
    Boy* boy;
public:
    Decorator(Boy* b) : boy(b) {}
    virtual void wearClothes() override {
        if (boy != nullptr) {
            boy->wearClothes();
        }
    }
};

接着,创建具体的装饰器类;

//穿西装
class JacketDecorator : public Decorator {
public:
    JacketDecorator(Boy* b) : Decorator(b) {}
    void wearClothes() override {
        Decorator::wearClothes();
        cout << "紧接着穿上西服" << endl;
    }
};

//打领带
class TieDecorator : public Decorator {
public:
    TieDecorator(Boy* b) : Decorator(b) {}
    void wearClothes() override {
        Decorator::wearClothes();
        cout << "最后再打领带" << endl;
    }
};

最后,在主函数中使用这些类来展示男生穿衣服的场景;

int main() {
    Boy* boy = new TieDecorator(new JacketDecorator(new ConcreteBoy()));
    boy ->wearClothes();

    delete boy ;

    return 0;
}

(五)装饰器模式优缺点

优点

  1. 灵活性:装饰器模式允许动态地给对象添加功能,而且可以根据需要多次进行装饰,从而实现各种组合方式,使得功能扩展变得非常灵活。
  2. 开闭原则:装饰器模式符合开闭原则,可以在不修改现有代码的情况下,增加新的功能。

缺点

  1. 复杂性:装饰器模式引入了许多小的对象和类,可能会导致系统中对象数量的增加,从而增加系统的复杂性。
  2. 容易出错:由于装饰器模式允许灵活地组合对象,因此在设计时需要特别小心,以避免出现过度复杂或混乱的装饰器组合,导致难以理解和维护的问题。

总体来说,装饰器模式是一种非常灵活的设计模式,能够有效地扩展对象的功能,同时也需要在设计时注意控制复杂性,避免出现过度装饰的情况。

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

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

相关文章

文档翻译-NVIDIA DALI Pipeline

文档地址&#xff1a; Pipeline — NVIDIA DALI 1.12.0 documentation 在DALI中&#xff0c;任何数据处理任务都有一个称为Pipeline的中心对象。Pipeline对象nvidia.dali.Pipeline或其派生类的实例。Pipeline封装了数据处理图和执行引擎。 您可以通过以下方式定义DALI管道&am…

虚拟内存页表和内存保护

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第21篇&#xff0c;在这里分享给大家&#xff0c;这篇文章讲虚拟内存和内存之间的页表和内存安全问题。 虚拟内存 前面的文章提到过&#xff0c;程序装载到内存的过程。可以知道&#xff0c;程序并不直接访…

【python】flask基于cookie和session来实现会话控制

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

使用Java版工程行业管理系统源码,提升工程项目的综合管理能力

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

3d模型变形动画怎么做---模大狮模型网

要制作3D模型的变形动画&#xff0c;你可以通过使用动画软件(如Blender、Maya、3ds Max等)中的变形工具和技术来实现。以下是一般的步骤来制作3D模型的变形动画&#xff1a; 创建基础模型&#xff1a;首先&#xff0c;在3D建模软件中创建或导入你想要进行变形的基础模型。这个基…

《InfMAE: A Foundation Model in Infrared Modality》CVPR2024

基础模型vs大模型&#xff1a;大模型&#xff0c;也称基础模型&#xff0c;是指具有大规模参数和复杂计算结构的机器学习模型 以后的研究中必须把大模型和基础模型耦合进来 总结&#xff1a;占坑 1. AB 多光谱的基础模型 红外的基础模型 可见光的基础模型 整体架构差不多…

智慧商显安卓主板MT8788_联发科MTK平台多媒体广告一体机方案

MT8788高性能智能主板&#xff0c;支持Android 9.0操作系统&#xff0c;支持双屏异显功能;MT8788是基于12nm工艺制程四核A73四核A53架构的八核心CPU,主频高达2.0GHz,拥有超强的通用计算性能。 MT8788主板采用10层二阶超高密度PCB板,集成了4G、百兆以太网、2.4G/5G 双频WiFi、蓝…

平时寄快递能够拿到最低的便宜价格吗?

现在快递物流与我们的日常生活联系很紧密了&#xff0c;但是等到我们真正去寄快递的时候就会很烦恼寄快递的价格怎么这么昂贵呢&#xff1f;但是我们又不得不选择去寄快递&#xff0c;所以我们能不能选择一种寄快递又方便&#xff0c;运费又便宜的方式呢&#xff1f; 尤其是我…

图书推荐|图解算法:C语言实现+视频教学版

零负担理解数据结构及其算法的设计&#xff0c;零基础也能快速上手编程。 本书内容 《图解算法&#xff1a;C语言实现视频教学版》是一本综合讲述数据结构及其算法的入门书&#xff0c;力求简洁、清晰、严谨、且易于学习和掌握。 《图解算法&#xff1a;C语言实现视频教学版》…

Flutter开发进阶之瞧瞧State

Flutter开发进阶之瞧瞧State 书接上回 上回说到StatefulWidget会将自身作为参数创建StatefulElement,然后StatefulElement的创建过程首先要调用_state = widget.createState(),会创建并持有一个state通过对其生命周期的管理去对Widget进行刷新,创建state后还会将自身交给st…

查看当前虚拟主机的php环境

近期看到一位用户在论坛的留言想要知道Linux虚拟主机的PHP环境&#xff0c;但是不清楚如何在主机上面查看&#xff0c;对于主机cPanel面板了解不多&#xff0c;因此在论坛寻求帮助。这边看到后详细的告知了这位用户&#xff0c;这边是以Hostease Linux虚拟主机为例的&#xff0…

Vue/Uni-app/微信小程序 v-if 设置出场/退出动画(页面交互不死板,看起来更流畅)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 在Vue.js中&#xff0c;使用v-if进行条件渲染时设置动画可以通过<transition>组件来实现。 具体操作步骤如下&#xff1a; 包裹条件渲染的元素&#xff1a;您需要将要通过v-if控制显示隐藏的元素包裹在<transition…

02. Java 中的关键字、标识符、运算符、分隔符和注释

关键字 Java 的关键字(keyword、保留字)是 Java 语言中具有特殊含义的单词&#xff0c;它们被保留供 Java 自身使用&#xff0c;不能被用作标识符。例如 public、class、void、int 等都是关键字。 关键字在 Java 语法中起着重要的作用&#xff0c;它们定义了编程的结构、控制…

合并两个有序数组(力扣)

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在Gitee或GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging…

QT_day2:2024/3/21

作业1&#xff1a;使用QT完成一个登录界面 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通过代码实现 3. 需要添加适当的动图 源代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget…

蓝桥杯算法练习系统—金属采集(树形dp)

问题描述 人类在火星上发现了一种新的金属&#xff01;这些金属分布在一些奇怪的地方&#xff0c;不妨叫它节点好了。一些节点之间有道路相连&#xff0c;所有的节点和道路形成了一棵树。一共有 n 个节点&#xff0c;这些节点被编号为 1~n 。人类将 k 个机器人送上了火星&…

3/21 work

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通…

头歌实训--机器学习(决策树)

第1关&#xff1a;决策树简述 第2关&#xff1a;决策树算法详解 import numpy as np from sklearn import datasets#######Begin####### # 划分函数 def split(x,y,d,value):index_a(x[:,d]<value)index_b(x[:,d]>value)return x[index_a],x[index_b],y[index_a],y[inde…

聚类算法之DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; DBSCAN是在1990年代后期推出的一种聚类方法&#xff0c;它迅速成为基于密度的聚类技术中最受欢迎和广泛使用的算法之一。与传统的聚类方法如K-me…