设计模式 装饰模式

news2024/11/24 1:44:40

文章目录

  • 装饰模式简介
  • 装饰模式结构
  • 装饰模式代码

装饰模式简介

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向现有对象动态添加新功能,而不需要修改其现有代码,并且可以通过组合多个装饰器对象实现多种功能组合,灵活性高。

装饰模式结构

Component(组件,对应下图中的主体-接口类):定义一个对象接口,可以动态地为对象添加新的功能。
ConcreteComponent(具体组件,对应下图中的主体-具体实现类):实现Component接口的具体对象,是被装饰的原始对象。
Decorator(装饰器,对象下图中装饰品–接口类):继承自Component,并持有一个Component对象,用于动态地为Component添加新的功能。
ConcreteDecorator(具体装饰器,对象下图中装饰品–具体实现类):实现Decorator接口的具体装饰器对象,负责向Component对象添加新的功能。
在这里插入图片描述

装饰模式代码

#include <iostream>
#include <string>

如何使用装饰器模式实现对文本的加密和压缩功能

// Component(组件)接口
class Text 
{
public:
    virtual std::string getContent() = 0;
};

// ConcreteComponent(具体组件)类
// 具体组件类在调用时用基类指针/引用
class PlainText : public Text 
{
private:
    std::string content;
public:
	// 完成对文本内容的初始化
    PlainText(const std::string& text) 
    : content(text) 
    {
    }
    
    // 组件的基本功能
    std::string getContent() override 
    {
        return content;
    }
};

// Decorator(装饰器)类
class TextDecorator : public Text 
{
protected:
    Text* text;
public:
	
	// 具体组件类在被装饰时用基类指针/引用
    TextDecorator(Text* t)
    : text(t) 
    {
    }
    
    std::string getContent() override 
    {
        return text->getContent();
    }
};

// ConcreteDecorator(具体装饰器)类 - 加密装饰器
class EncryptionDecorator : public TextDecorator 
{
public:

	// 调用被装饰对象的类的构造函数, 初始化被装饰对象已有的部分
	// 如果有多个具体装饰器类,可以多次装饰,且装饰效果可以叠加,即功能可拓展
    EncryptionDecorator(Text* t) 
    : TextDecorator(t) 
    {
    }
    
    std::string getContent() override 
    {
        std::string content = text->getContent();
        // 简单加密(示例)
        for (char& c : content) 
        {
            c = c + 1;
        }
        return content;
    }
};

// ConcreteDecorator(具体装饰器)类 - 压缩装饰器
class CompressionDecorator : public TextDecorator 
{
public:
    CompressionDecorator(Text* t) 
    : TextDecorator(t) 
    {
    }
    
    std::string getContent() override 
    {
        std::string content = text->getContent();
        // 简单压缩(示例)
        return content.substr(0, content.size() / 2);
    }
};

int main() 
{
    Text* text = new PlainText("Hello, World!");

    // 添加加密功能
    Text* encryptedText = new EncryptionDecorator(text);
    std::cout << "Encrypted Text: " << encryptedText->getContent() << std::endl;

    // 添加压缩功能
    Text* compressedText = new CompressionDecorator(text);
    std::cout << "Compressed Text: " << compressedText->getContent() << std::endl;

    delete text;
    delete encryptedText;
    delete compressedText;

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key 。。。

控制台信息&#xff1a; 这个信息一般是yml文件配置出现了问题&#xff0c;如 出现非法数据 、缩进有问题等 问题地方如下&#xff0c;修改一下就好了 控制台一般报的这种错就是配置文件的格式不正确

FileLink内外网文件摆渡系统产品介绍

在现代企业中&#xff0c;往往存在着多个网络、系统之间的数据孤岛问题&#xff0c;数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入&#xff0c;效率低下且容易出错。如&#xff1a;U盘、FTP、VPN等&#xff0c;极易引发各种各样…

算法基础课 贪心算法模板题笔记

AcWing算法基础课 贪心算法模板题笔记 贪心得到的答案 > 最优解 贪心得到的答案 < 最优解 局部最优 -> 全局最优 文章目录 1 区间问题例1&#xff1a;区间选点例2&#xff1a;最大不相交区间数量例3&#xff1a;区间分组例4&#xff1a;区间覆盖 2 Huffman树例&…

Spark SQL - 简介

目录 1. 概念介绍 2. Spark SQL与Hive的区别 3. 数据结构分类 4. 特点 4.1 易整合 4.2 统一的数据访问方式 4.3 兼容hive 4.4 提供标准的数据连接 5 Spark的数据模型介绍 1. 概念介绍 sparkSQl是spark专门针对结构化数据(DataFrame和DataSets)处理的一个组件&#xf…

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体&#xff1a; 1、AVFormatContext结构体&#xff1a; AVFormatContext是一个贯穿全局的数据结构&#xff0c;很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context&#xff0c;此结构包含了一个视频流的格式内容。其中存有AVIputFor…

YOLO新鲜腐烂水果检测数据集:8类,11000多张图像,标注完整

YOLO新鲜腐烂水果检测数据集&#xff1a;8类&#xff0c;11000多张图像&#xff0c;yolo标注完整&#xff0c;包含烂苹果&#xff0c;烂香蕉&#xff0c;烂橙子&#xff0c;烂石榴&#xff0c;好苹果&#xff0c;好香蕉&#xff0c;好橙子&#xff0c;好石榴8个类别 图像统一分…

2024年4月28日

2024年4月28日08:14:11 utf8和utf8mb4的区别 CRATE DATABSE USE DATABASE DROP DATABASE 2024年4月28日08:34:56 主线和支线/理论和实践 DECIMAL(P&#xff0c;D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。 2024年4月28日08:36:02 如何去欣赏一…

NFS服务器(linux-linux)

目录 简介 NFS背景介绍 生产应用场景 NFS工作原理 示例图 流程 NFS的使用 安装 配置文件 主配置文件分析 实验1 NFS账户映射 实验2&#xff1a; 实验3 autofs自动挂载服务 产生原因 安装 配置文件分析 实验4 实验5 简介 NFS背景介绍 NFS是一种古老的用于…

Xinstall助力手游推广,打破传统营销方式

随着移动互联网的普及&#xff0c;手游市场日益繁荣&#xff0c;手游推广方式也日新月异。在这个竞争激烈的市场中&#xff0c;如何有效地推广手游&#xff0c;吸引更多的用户&#xff0c;成为了开发者和广告主关注的焦点。而Xinstall作为国内专业的App全渠道统计服务商&#x…

这份详细的智慧校园建设方案,赶紧收藏

高等教育信息化是促进高等教育改革创新和提高质量的有效途径&#xff0c;是教育信息化发展的创新前沿。进一步加强基础设施和信息资源建设&#xff0c;重点推进信息技术与高等教育的深度融合&#xff0c;能促进教育内容、教学手段和方法现代化&#xff0c;创新人才培养、科研组…

C语言进阶|链表经典OJ题

✈移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 方法一&#xff1a; 遍历链表找到所有等于val的节点&#xff0c;再执行删除操作删除这些节点。 方法二&#xff1a; …

小程序中如何绑定会员个人信息

在小程序中&#xff0c;用户可以在个人中心页面来设置用户名、头像、手机号码和身份证号码等个人信息。以下是具体的操作步骤&#xff1a; 1. 进入个人中心->账户设置。在个人中心页面&#xff0c;点击设置按钮&#xff0c;即可进入账户设置页面。在这个页面进行账号信息设…

百万人都在求的网络安全学习路线,渗透漏洞防御总结(附图)

前言 不折腾的网络安全&#xff0c;和咸鱼有什么区别 目录 二、 前言三 、同源策略 3.1 什么是同源策略 3.2 为什么需要同源策略四 、XSS 4.1 概览 4.2 介绍 4.3 防御五 、CSRF 5.1 概览 5.2 介绍 5.3 防御六、 SQL 注入七 、流量劫持 7.1 DNS 劫持 7.2 HTTP 劫持…

某知乎APP - X-Zse-96

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 接口网址 app 版本: 8.10.0 aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM 加密位置分析 > …

MySQL从入门到高级 --- 3.DML基本操作

文章目录 第三章&#xff1a;3.基本操作 - DML3.1 数据插入3.2 数据修改3.3 数据删除3.4 练习 第三章&#xff1a; 3.基本操作 - DML DML&#xff1a;数据操作语言&#xff0c;用来对数据中表的数据记录进行更新 关键字&#xff1a; insert 插入 delete 删除 update 更新 …

CLIP是啥?

论文地址&#xff1a;https://arxiv.org/pdf/2103.00020v1 代码地址&#xff1a;GitHub - openai/CLIP: CLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image 题目解读 Transferable Visual model指不使用特定数据集的数…

【代码随想录刷题记录】LeetCode844比较含退格的字符

题目地址 1. 思路 1.1 基本思路 拿到这个题&#xff0c;我们要单独写一个函数去将退格后的字符串结果返回出来&#xff08;生成退格后的真实的字符串&#xff09;&#xff0c;我还是想魔改 O ( n ) O(n) O(n)时间复杂度的删除数组元素的算法&#xff1a;【代码随想录刷题记录…

认识Linux及一些基本

目录 linux简介&#xff1a; 1. 发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 企业应用现状 Linux在服务器领域的发展 Linux在桌面领域的发展 Linux在移动嵌入式领域的发展 Linux在云计算/大数据领域的发展 4. 发行版本 Debian Ubuntu 红帽企业级Linux Cent…

LLDP简介

LLDP简介 定义 LLDP&#xff08;Link Layer Discovery Protocol&#xff09;是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式&#xff0c;可以将本端设备的管理地址、设备标识、接口标识等信息组织起来&#xff0c;并发布给自己的邻居设备&#xff0c;邻…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日&#xff0c;在2024中关村论坛年会未来人工智能先锋论坛上&#xff0c;清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上&#xff0c;清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…