当前位置: 首页 > news >正文

重温设计模式----装饰模式

文章目录

    • 装饰模式定义
    • UML 图
    • 其主要优点包括:
    • 装饰模式的主要角色有:
    • C++ 代码示例
    • 总结

装饰模式定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式必生成子类更加灵活

装饰模式(Decorator Pattern)属于结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

UML 图

在这里插入图片描述

其主要优点包括:

比继承更灵活:继承是在编译时静态决定的,而装饰模式可以在运行时动态地给对象添加职责,更加灵活地扩展功能。
可以对一个对象多次装饰:能够按照需要多次用不同的装饰类去修饰同一个对象,层层叠加功能。
符合开闭原则:对扩展开放,对修改关闭。可以在不修改原有代码的基础上添加新的装饰功能。

装饰模式的主要角色有:

抽象构件(Component):定义一个对象接口,可以给这些对象动态添加职责。
具体构件(ConcreteComponent):实现了抽象构件接口,是被装饰的原始对象。
抽象装饰类(Decorator):继承自抽象构件,并且包含一个指向抽象构件的指针,其目的是为了能包裹具体构件以及其他装饰类,同时也定义了与抽象构件一致的接口。
具体装饰类(ConcreteDecorator):实现抽象装饰类,负责给构件对象添加新的职责。

C++ 代码示例

以下是一个简单的用 C++ 实现装饰模式的代码示例,模拟给一个简单图形绘制添加不同装饰效果的场景:

#include <iostream>
#include <string>
#include<Windows.h>
// 抽象构件
class Shape
{
public:virtual void draw() = 0;virtual ~Shape() {}
};// 具体构件,比如这里的圆形
class Circle : public Shape
{
public:void draw() override{std::cout << "Drawing a circle" << std::endl;}
};// 抽象装饰类,继承自抽象构件
class ShapeDecorator : public Shape
{
protected:Shape* decoratedShape;
public:ShapeDecorator(Shape* shape) : decoratedShape(shape) {}void draw() override{if (decoratedShape){decoratedShape->draw();}}
};// 具体装饰类,比如添加红色边框装饰
class RedBorderDecorator : public ShapeDecorator
{
public:RedBorderDecorator(Shape* shape) : ShapeDecorator(shape) {}void draw() override {ShapeDecorator::draw();addRedBorder();}
private:void addRedBorder(){std::cout << "Adding red border" << std::endl;}
};// 另一个具体装饰类,比如添加阴影装饰
class ShadowDecorator : public ShapeDecorator
{
public:ShadowDecorator(Shape* shape) : ShapeDecorator(shape) {}void draw() override {ShapeDecorator::draw();addShadow();}
private:void addShadow(){std::cout << "Adding shadow" << std::endl;}
};int main()
{Shape* circle = new Circle();// 第一次装饰,添加红色边框Shape* redBorderCircle = new RedBorderDecorator(circle);// 第二次装饰,在有红色边框的基础上添加阴影Shape* decoratedCircle = new ShadowDecorator(redBorderCircle);decoratedCircle->draw();// 释放内存,注意要按照创建顺序的逆序释放delete decoratedCircle;delete redBorderCircle;delete circle;char t;std::cin>>t;return 0;
}

在这里插入图片描述

在上述代码中:
Shape 是抽象构件,定义了 draw 这个抽象方法用于绘制图形。
Circle 作为具体构件实现了 Shape 接口,代表实际要被装饰的基础图形。
ShapeDecorator 是抽象装饰类,它持有一个指向 Shape 的指针,在 draw 方法中调用被装饰对象的 draw 方法,方便后续装饰类在此基础上添加额外功能。
RedBorderDecorator 和 ShadowDecorator 是具体装饰类,它们分别重写了 draw 方法,先调用父类(也就是被装饰对象的)draw 方法,然后添加各自独特的装饰功能,像添加红色边框或者添加阴影。
在 main 函数里,可以看到先创建了一个圆形对象,然后通过多次创建不同的装饰类对象,层层对圆形进行装饰,最后调用 draw 方法就能看到带有多种装饰效果的图形绘制的逻辑展示,并且最后按照创建顺序的逆序释放了内存,避免内存泄漏。

总结

装饰模式,其实可以理解为套娃,一层套一层

相关文章:

重温设计模式----装饰模式

文章目录 装饰模式定义UML 图其主要优点包括&#xff1a;装饰模式的主要角色有&#xff1a;C 代码示例总结 装饰模式定义 动态的给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式必生成子类更加灵活 装饰模式&#xff08;Decorator Pattern&…...

第十六章 C++ 字符串

C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此&#xff0c;一个以 null 结尾的…...

MySQL中Seconds_Behind_Master是怎么计算的

目录 1.Seconds_Behind_Master计算方式2.Seconds_Behind_Master 计算方式会存在什么问题3.更好的方式3.1 实现方法3.2 优点在MySQL中,Seconds_Behind_Master是一个用于表示从库(Slave)落后于主库(Master)的时间(以秒为单位)的指标。 1.Seconds_Behind_Master计算方式 其…...

React Native 集成原生Android功能

React Native 集成原生功能完整指南 前言 在 React Native 开发中&#xff0c;我们经常需要使用设备的原生功能&#xff0c;比如蓝牙、打印机等。本文将以集成打印机功能为例&#xff0c;详细介绍如何在 React Native 项目中集成 Android 原生功能。 集成步骤概述 创建原生…...

Mac mini m4安装PD和Crack和关闭SIP

文章目录 说明PD下载地址Crack下载地址PD版本补丁版本说明SIP简介SIP关闭方法启用 SIP&#xff1a;补充说明 说明 参考文章地址 PD下载地址 PD20.0.0 PD20.0.1 PD20.1.0 PD20.1.1 PD20.1.2 PD20.1.3 Crack下载地址 Parallels Desktop Activation Tool PD版本补丁版本…...

详解C语言中的关键词:extern以及它需要注意的事项

extern 是C语言中一个非常重要的关键字&#xff0c;用于声明变量或函数的 外部链接性&#xff0c;即在当前文件中使用另一个文件中定义的变量或函数。以下是 extern 的作用和使用场景&#xff1a; 1. extern 的作用 跨文件访问&#xff1a; extern 告诉编译器&#xff0c;某个…...

框架程序设计-简答以及论述

目录 maven的pom作用&#xff1a; Pointcut("execution(*com.example.dome.*.*(……))") 缓存的作用&#xff0c;redis配置过程 Redis配置过程&#xff1a; SpringBoot缓存配置过程&#xff1a; AOP的五种增强注解&#xff1a; 论述题&#xff1a;包结构作用、…...

ce第六次作业

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 [rootServer ~]# yum install -y mailx [rootServer ~]# yum -y install bind-utils [rootServer ~]# vim /etc/mail.rc set from15339…...

为何页面搜索应避免左模糊和全模糊查询???

前言 在构建高效且可扩展的Web应用程序时&#xff0c;数据库查询的性能是影响用户体验的关键因素之一。特别是对于涉及大量数据的页面搜索功能&#xff0c;选择正确的查询方式不仅可以提升应用的速度&#xff0c;还能显著改善用户交互体验。 B-Tree索引与最左前缀匹配特性 1…...

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会&#xff0c;CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英&#xff0c;共同探讨AI技术的最新进展、挑…...

在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比

1. 安装torch 在官网上可以查看安装教程&#xff0c;Start Locally | PyTorch 作者安装了目前最新的torch版本2.5.1&#xff0c;需要提前安装python3.9及以上版本&#xff0c;作者python版本是python3.11最新版本 使用conda安装torch&#xff0c;在终端进入要安装的环境&…...

生成式人工智能在生产型企业中的应用

生成式人工智能&#xff08;Generative AI&#xff09;是指使用人工智能来创建新内容&#xff0c;如文本、图像、音乐、音频和视频等。生成式人工智能在生产型企业中的应用涵盖了内容创作与自动化、数据分析与决策支持、生产流程优化、产品设计与开发、客户服务与沟通、员工培训…...

Linux逻辑卷管理

目录 实验要求 实验操作 1、 为Linux新添加一块SCSI磁盘/dev/sdc&#xff0c;容量为1024MB。在该磁盘上创建三个分区sdc1、sdc2、sdc3&#xff0c;大小为128MB&#xff0c;标识为Linux native分区。 2、 在三个分区上创建物理卷&#xff1b;将三个物理卷加入VolGroup00卷组&…...

机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效

机器人加装电主轴进行铣削、钻孔、打磨、去毛刺等作业&#xff0c;展现出显著的优势&#xff0c;并能实现高效加工。 1. 高精度与高效率 电主轴特点&#xff1a;高速电主轴德国SycoTec的产品&#xff0c;转速可达100000rpm&#xff0c;功率范围广&#xff0c;精度≤1μm&#…...

opencv sdk for java中提示无stiching模块接口的问题

1、问题介绍 安卓项目中有新的需求&#xff0c;在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时&#xff0c;出现大量报错&#xff0c;如下截图所示 实际上&#xff0c;其他opencv的接口函数 例如 core dnn等都能正常使用&#xff0c;直觉上初步怀疑 ope…...

今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福

1、朋友相伴&#xff0c;友谊真诚永不变&#xff01;彼此扶持绿树荫&#xff0c;共度快乐雨后天&#xff01;一同分享的表情&#xff0c;愿我们友情长存&#xff0c;一生相伴永相连&#xff01; 2、人生几十年&#xff0c;苦累伴酸甜&#xff0c;风华不再茂&#xff0c;雄心非当…...

五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO

在操作系统中处理输入/输出&#xff08;IO&#xff09;操作的过程中&#xff0c;存在多种方式&#xff0c;包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。这些方式在操作系统实现和应用程序编写时有着不同的适用场景和性能特征。接下来&#xff0c;我将逐一介绍它们…...

Vscode GStreamer插件开发环境配置

概述 本教程使用vscode和Docker搭建Gstreamer2.24的开发环境&#xff0c;可以用于开发调试Gstreamer程序或者自定义插件开发。 1. vscode依赖插件 C/C Extension Pack&#xff08;ms-vscode.cpptools-extension-pack&#xff09;&#xff1a;该插件包包含一组用于 Visual St…...

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时&#xff0c;Flask 会调用对应的视图函数来处理请求 def index():return …...

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…...

[AI应用框架/Java] Spring AI 应用开发指南<>概述、快速入门鼻

本文能帮你解决什么&#xff1f; 1. 搞懂FastAPI异步&#xff08;async/await&#xff09;到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑&#xff08;比如阻塞操作、数据库连接池耗尽、GIL限制&#xff09;。 …...

如何高效使用Dism++:Windows系统优化与管理的终极指南

如何高效使用Dism&#xff1a;Windows系统优化与管理的终极指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款功能强大的Windows系统优化工具&…...

JavaScript this 关键字详解

JavaScript this 关键字详解 引言 在JavaScript中,this 是一个非常重要的关键字,它用来指代当前执行上下文中的对象。理解 this 的行为和作用域对于编写高效、可维护的JavaScript代码至关重要。本文将深入探讨 this 的概念、用法以及在不同场景下的表现。 什么是 this? …...

融合 PSO 的改进鲸鱼优化算法(PSO‑ImWOA)无人机三维航迹规划研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

边缘设备资源告急?立刻启用.NET 9的Dynamic PGO+Crossgen2预编译组合技(仅限Preview 5+)

第一章&#xff1a;边缘设备资源告急&#xff1f;立刻启用.NET 9的Dynamic PGOCrossgen2预编译组合技&#xff08;仅限Preview 5&#xff09;在资源受限的边缘设备&#xff08;如Raspberry Pi 4、Jetson Nano或工业PLC网关&#xff09;上&#xff0c;.NET应用常因JIT编译开销与…...

SEATA分布式事务——AT模式一

简介 AI Agent 不仅仅是一个能聊天的机器人&#xff08;如普通的 ChatGPT&#xff09;&#xff0c;而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统&#xff0c;更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料&#xff0c;agent的…...

ETASOLUTIONS钰泰 ETA3409S2F SOT23-5 DC-DC电源芯片

特性 宽输入电压范围:2.4-7.3V待机电流42uA(输出电压1.2V&#xff0c;输出电流0A) 最高可达96%效率最大输出电流可达3安培1MHz频率轻载运行内部补偿功能微型S0T23-5封装...

LVGL实战:手把手教你用FatFS给STM32上的LVGL挂载SD卡文件系统(附多设备管理技巧)

LVGL实战&#xff1a;STM32多存储设备文件系统集成与优化指南 在嵌入式UI开发中&#xff0c;资源管理往往成为制约项目灵活性的瓶颈。当LVGL界面需要加载大量图片、字体等外部资源时&#xff0c;如何高效管理SD卡、SPI Flash等多种存储介质&#xff0c;成为提升开发效率的关键。…...

Python图书借阅管理系统实战

# 题目描述# 设计一个简单的图书借阅管理系统。系统初始包含若干本图书&#xff0c;每本图书的信息包括&#xff1a;# 书号&#xff08;字符串&#xff09;# 书名&#xff08;字符串&#xff09;# 作者&#xff08;字符串&#xff09;# 库存数量&#xff08;整数&#xff09;# …...

微信小程序与H5深度交互:实现扫码功能的无缝传递与数据回传

1. 微信小程序与H5交互的核心技术解析 微信小程序与H5页面的交互一直是移动开发中的热门话题。在实际项目中&#xff0c;我们经常需要在小程序内嵌H5页面&#xff0c;同时又要调用小程序原生功能。这种混合开发模式既能利用H5的跨平台特性&#xff0c;又能享受小程序的原生能力…...