【21】c++设计模式——>装饰模式
装饰模式的定义
装饰模式也可以称为封装模式,所谓的封装就是在原有行为之上进行扩展,并不会改变该行为;
例如网络通信:
在进行网络通信的时候,数据是基于IOS七层或四层网络模型(某些层合并之后就是四层模型)进行传输,通过下图可得知从应用层到物理层,数据每向下走一层就会被封装一层,最后将封装好的数据以比特流的方式发送给接收端。封装之后数据只是变得更复杂了, 并没有改变它是数据的本质。

加解密是对数据的装饰,但是没有改变数据的本质。
防护服是对人的装饰,没有改变本体是人的本质。
装饰模式组成装饰模式是一种结构型设计模式,他允许你在运行时为对象动态的添加新的行为,而无需修改其源代码。
在装饰模式中,有四个主要角色:
抽象组件:定义了被装饰对象的接口,它可以是一个抽象类或接口。在抽象组件中定义了待装饰对象的基本操作;
具体组件:实现了抽象组件的接口,是被装饰的原始对象
装饰器:实现了抽象组件接口,并持有一个抽象组件对象的引用。装饰器可以通过对被装饰对象的包装来扩展其功能。
具体装饰器:具体装饰器是装饰器的具体实现,它通过在具体组件的基础上添加额外的功能来装饰对象。
代码实例
#include <iostream>
#include <fstream>
#include <string>
using namespace std;/*我要做的是写一个吃了很多恶魔果实的黑胡子,
* 每吃一个恶魔果实,黑胡子就会获得相应的技能
* 这个就相当于装饰自己
*/
/*定义一个抽象战士类
*有了这个抽象类就可以对某个人,或者某个恶魔果实的战力进行具体的实现
*这个类有两个方向
* 1.派生出某个具体的战士,比如黑胡子
* 2.派生出恶魔果实类,因为战士是恶魔果实的载体,这些恶魔果实可以装饰这个战士
*/
class Soldier
{
public:Soldier() {}Soldier(string name) :m_name(name) {}string getName(){return m_name; //获取战士的名字}virtual void fight() {} //所有战士都可以战斗virtual ~Soldier() {}
protected:string m_name = string(); //战士的名字
};
//实例化战士:黑胡子
class Teach :public Soldier
{
public:using Soldier::Soldier;//继承构造,使用父类的构造函数,不是很理解这个东西void fight() override{cout <<m_name << "依靠惊人的力量和高超的体术战斗..." << endl;}
};
/*恶魔果实基类
*这里一件很重要额操作就是指定载体,就是这个恶魔果实谁来吃
*这个还是个抽象类,因为没有重写父类的fight方法
*派生3个类:暗暗果实,大饼果实,震震果实
*/
class DevilFruit :public Soldier
{
public://附魔函数,指定载体void enchantment(Soldier* soldier){m_soldier = soldier;m_name = soldier->getName();}
protected:Soldier* m_soldier = nullptr;
};
/*暗暗果实
* 继承恶魔果实
*/
class DarkFruit :public DevilFruit
{
public:void fight() override{m_soldier->fight();//吃果实前的能力cout << m_soldier->getName()<< "吃了暗暗果实, 可以拥有黑洞一样的无限吸引力..." << endl;}
private:void warning() //定义类独有的方法{cout << m_soldier->getName() << "你要注意: 吃了暗暗果实, 身体元素化之后不能躲避攻击,会吸收所有伤害!" << endl;}
};/*震震果实
* 继承恶魔果实
*/
class QuakeFruit :public DevilFruit
{
public:void fight() override{m_soldier->fight();cout << m_soldier->getName() << "吃了震震果实, 可以在任意空间引发震动, 摧毁目标...!" << endl;}
};// 大饼果实
class PieFruit : public DevilFruit
{
public:void fight() override{m_soldier->fight();cout << m_soldier->getName()<< "吃了大饼果实, 获得大饼铠甲...!" << endl;ability();}void ability(){cout << "最强辅助 -- 大饼果实可以将身边事物变成大饼, 帮助自己和队友回血..." << endl;}
};
int main()
{Soldier* teach = new Teach("黑胡子");DevilFruit* dark = new DarkFruit;DevilFruit * quake = new QuakeFruit;DevilFruit* pie = new PieFruit;dark->enchantment(teach); //用暗暗果实装饰黑胡子quake->enchantment(dark); //用震震果实装饰吃了暗暗果实的黑胡子pie->enchantment(quake); //用大饼果实装饰吃了暗暗果实和震震果实的黑胡子pie->fight();delete pie;delete quake;delete dark;delete teach;return 0;}

相关文章:
【21】c++设计模式——>装饰模式
装饰模式的定义 装饰模式也可以称为封装模式,所谓的封装就是在原有行为之上进行扩展,并不会改变该行为; 例如网络通信: 在进行网络通信的时候,数据是基于IOS七层或四层网络模型(某些层合并之后就是四层模型…...
【博客707】模版化拆解并获取victoriametrics的metricsql各个元素
golang解析victoriametrics的metricsql 场景: 需要拆解metricsql中的部分元素,比如:rollup function,label filter等需要对语法合法性进行判断,同时拒绝某些查询函数我们需要拆解metricsql并进行改造 使用victoriam…...
nodejs + express 实现 http文件下载服务程序
nodejs express 实现 http文件下载服务程序, 主要包括两个功能:指定目录的文件列表,某个文件的下载。 假设已经安装好 nodejs ; cd /js/node_js ; 安装在当前目录的 node_modules/ npm install express --save npm install express-gene…...
Qt多文本编辑器项目实战
0x00 引言 本文将详细讲解如何使用Qt实现一个多文本编辑器。涉及的话题包括:Qt框架基础、窗体布局、文本编辑、拓展功能等等。 在阅读本文之前,你需要掌握基本的C编程知识和Qt框架的使用方法。 0x01 新建Qt项目 在Qt Creator中,新建一个Q…...
CVE-2017-7529 Nginx越界读取内存漏洞
漏洞概述 当使用Nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header请求,来获取响应中的缓存文件头部信息。在某些配置中,缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。 影响版本 Ngin…...
力扣每日一题136:只出现一次的数字
题目描述: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 &#…...
导航栏参考代码
导航栏参考代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>导航栏参考代码</title> </head> <body> <table width"858" border"0" align"center"><tr&g…...
区块链(11):java区块链项目之页面部分实现
addPeer.html <!DOCTYPE html> <html> <head><meta charset="utf-8"> <title>java区块链</title><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="styles…...
RootSIFT---SIFT图像特征的扩展
RootSIFT是论文 Three things everyone should know to improve object retrieval - 2012所提出的 A Comparative Analysis of RootSIFT and SIFT Methods for Drowsy Features Extraction - 2020 当比较直方图时,使用欧氏距离通常比卡方距离或Hellinger核时的性能…...
ChatGPT角色扮演教程,Prompt词分享
使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用 https://ai.idcyli.comhttps://ai.idcyli.com 雅思写作考官 我希望你假定自己是雅思写作考官,根据雅思评判标准,按我给你的雅思考题和对应答案给我评分,并且按…...
zabbix监控——自定义监控内容
目录 自定义监控项步骤 案例 1、明确需要执行的命令 2、创建 zabbix 的监控项配置文件,用于自定义 key,并重启zabbix-agent2 3、.在服务端验证新建的监控项 4、在 Web 页面创建自定义监控项模板 1)创建模板 2)创建监控项 …...
中断机制-中断协商机制、中断方法
4.1 线程中断机制 4.1.1 从阿里蚂蚁金服面试题讲起 Java.lang.Thread下的三个方法: 4.1.2 什么是中断机制 首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,…...
three.js入门 —— 实现第一个3D案例
前言: three.js入门,根据文档实现第一个3D案例 效果图: 代码实现: const scene new THREE.Scene();//创建一个长方体几何对象Geometryconst geometry new THREE.BoxGeometry(100, 100, 100);//创建一个网络基础材质的材质对象…...
《动手学深度学习 Pytorch版》 8.4 循环神经网络
8.4.1 无隐状态的神经网络 对于无隐藏装态的神经网络来说,给定一个小批量样本 X ∈ R n d \boldsymbol{X}\in\mathbb{R}^{n\times d} X∈Rnd,则隐藏层的输出 H ∈ R n h \boldsymbol{H}\in\mathbb{R}^{n\times h} H∈Rnh 通过下式计算: …...
什么是物联网阀控水表?
物联网阀控水表是一种新型的水表,结合了物联网技术和传统水表的功能,可以实现对水的计量、控制和管理。随着人们对水资源的日益重视,物联网阀控水表的应用越来越广泛,为水资源的合理利用和管理提供了有效手段。 物联网阀控水表是由…...
Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证
Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证。 kafka安全涉及3部份:传输加密,用户认证与授权,ZK开启ACL(Zookeeper存储了kafka的元数据以及用户信息,默认不开启acl所有用户可改,内网环境机器不对外开放可考虑使用默认不开启ZK ACL)。 官网地址:https://kafka.ap…...
关于智能控制领域中模糊控制算法的概述
智能控制领域中的模糊控制算法是一种基于模糊逻辑的控制策略,它通过对模糊集合的刻画来处理模糊信息,从而获得模糊输出并进行控制。模糊控制算法在实际控制工程中具有良好的应用前景,它不但具有较强的鲁棒性和适应性,而且可以为复…...
剖析伦敦银最新价格走势图
国际金融市场瞬息万变,伦敦银的价格走势会受到诸多因素的影响,比如重要经济数据的公布,国际间的政治博弈,突发的政经大事,都可以令白银价格的走势,在短时间内暴涨暴跌的情况。 要在伦敦银市场实现良好的收益…...
通用人工智能技术(深度学习,大模型,Chatgpt,多模态,强化学习,具身智能)
目录 前言 1.通用人工智能 1.1 生物学分析 1.2具身智能 1.2.1当前的人工智能的局限 1.2.2 具身智能实现的基础 1.2.3 强化学习(决策大模型) 2.结论 往期文章 参考文献 前言 目前的人工智能实质上只是强人工智能,或者说单个领域的通…...
makefile的特性-部分语法记录
1.变量定义 1.1 来实现a1 $(a2)a2 lib.o1.2 : 来实现, 这种不能通过后面的变量来定义a1 : $(a2) b.0a2 : lib.o1.3 来实现a1 b.0a2 a11.4 ? 来实现,这种方式前面如果定义了,后面定义则无效a1 : a.oa1 ? lib.o //结果 a1 a.o 2.文件查找 2.1 VPATH 目录…...
YOLO算法集成 车道线识别 + 目标检测 +图像分割识别
YOLO车道线识别 目标检测 可行驶区域(Freespace)的综合应用引言 随着自动驾驶技术和智能交通系统的迅速发展,车辆环境感知技术变得愈加重要。准确地理解周围环境对于确保自动驾驶的安全性和可靠性至关重要。在众多的环境感知任务中…...
什么是历史与社会学
读懂历史与社会学 目录 读懂历史与社会学为什么格局大的人都在学历史和社会学?一、历史与社会学:一对孪生的认知工具1. 历史:人类社会的“时间轴”2. 社会学:人类社会的“解剖图”3. 两者的关系:历史是社会学的实验室&…...
深度学习优化算法(三)—— 自适应学习率(AdaGrad/RMSProp/Adam/AdamW)(三十五)
1. 定位导航 第 34 篇我们解决了"方向"问题(Momentum 让训练快 10)。本篇解决另一个核心问题:每个参数应该用多大学习率? 第 8 章规划进度: 篇号 主题 状态 33 优化挑战 ✅ 34 SGD + Momentum + Nesterov ✅ 35(本篇) 自适应学习率 🚀 36 参数初始化策略 …...
Claude Code、Cursor、GitHub Copilot、Codex 怎么选?别再按“哪个最强”来判断了
AI 编程工具越来越像“工具箱”,而不是单个聊天窗口。如果你还在问“Claude Code、Cursor、Copilot、Codex 哪个最强”,这个问题本身就有点偏。更好的判断方式是:你当前的任务发生在哪里、需要改多少文件、是否需要跑测试、结果要不要进入 PR…...
突破存储限制:群晖DSM7下Synology Photos自定义文件夹挂载实战
1. 为什么需要自定义文件夹挂载 很多群晖用户升级到DSM7后都会遇到一个头疼的问题:Synology Photos默认把所有个人照片都存放在/home/Photos目录下,而这个目录实际上位于/homes共享文件夹中。随着照片数量不断增加,/homes所在存储空间很快就会…...
Flutter GetX实战:从Provider迁移到GetX,我的开发效率提升了多少?
Flutter GetX实战:从Provider迁移到GetX的效率革命 当Flutter开发团队面临状态管理方案的选择时,往往会陷入一种甜蜜的烦恼——官方推荐的Provider虽然稳定可靠,但第三方库GetX却以"全家桶"式的解决方案不断吸引开发者的目光。作为…...
AI智能体生态的包管理器:agenticmarket-cli 设计与实践
1. 项目概述:一个面向AI智能体生态的命令行工具如果你和我一样,长期在AI智能体(Agent)这个领域里折腾,那你肯定经历过这样的场景:为了测试一个最新的开源智能体框架,你需要先找到它的GitHub仓库…...
Godot卡牌游戏框架终极指南:3小时从零构建专业级卡牌游戏
Godot卡牌游戏框架终极指南:3小时从零构建专业级卡牌游戏 【免费下载链接】godot-card-game-framework A framework which comes with prepared scenes and classes to kickstart your card game, as well as a powerful scripting engine to use to provide full r…...
OpenSpeedy终极指南:如何通过开源游戏加速工具突破帧率限制
OpenSpeedy终极指南:如何通过开源游戏加速工具突破帧率限制 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否厌倦了游戏中的卡顿和帧率限制?Open…...
Kubernetes配置管理实战:基于Kustomize的结构化部署与多环境管理
1. 项目概述:一个被低估的Kubernetes配置管理利器如果你和我一样,长期在Kubernetes生态里摸爬滚打,那你一定经历过这样的场景:为了部署一个稍微复杂点的应用,需要维护一堆YAML文件——Deployment、Service、ConfigMap、…...
