新版MQL语言程序设计:装饰器模式的原理、应用及代码实现

文章目录

    • 一、什么是装饰器模式
    • 二、为什么需要装饰器模式及应用场景
    • 三、装饰器模式的代码实现

一、什么是装饰器模式

装饰器模式是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类的对象中来动态地扩展其功能。装饰器模式提供了一种比继承更加灵活的方式来扩展对象的功能,同时也遵循了开闭原则。

二、为什么需要装饰器模式及应用场景

当需要在不改变原有对象结构的情况下,动态地给对象增加额外的功能。它可以在运行时动态地添加、修改或删除对象的行为,使得代码更加灵活和可扩展。

使用场景包括

  1. 动态地给对象添加功能:装饰器模式可以在不改变原有对象的情况下,动态地给对象添加新的功能。这样可以避免创建大量的子类来实现不同的功能组合,提高了代码的可维护性和可扩展性。
  2. 需要对对象的功能进行扩展或修改:装饰器模式可以在运行时动态地给对象添加新的功能,而不需要修改原有对象的代码。这样可以避免因为修改原有对象而引入风险和错误。
  3. 需要对对象的功能进行组合:装饰器模式可以通过不同的装饰器组合来实现不同的功能效果。这样可以灵活地组合不同的功能,满足不同的需求。

总之,装饰器模式的主要作用是在不改变原有对象结构的情况下,动态地给对象增加额外的功能,提高了代码的灵活性和可扩展性。

三、装饰器模式的代码实现

//+------------------------------------------------------------------+
//| interface — for patterns                                         |
//+------------------------------------------------------------------+
interface ClientInterface
{string Output(void); // returns headervoid Run(void);      // execute the pattern client
};
//+------------------------------------------------------------------+
//| interface — for patterns                                         |
//+------------------------------------------------------------------+
void Run(ClientInterface* client) //launches a pattern
{printf("---\n%s", client.Output()); //print pattern headerclient.Run(); //execute client collaborationsdelete client; //exit
}
//+------------------------------------------------------------------+
//| structure                                                        |
//+------------------------------------------------------------------+
//
//                  | Component |<------------------------------+
//                  |-----------|                               |
//                  |Operation()|                               |
//                        ^                                     |
//                        |                                     |
//            +-----------+-------------+                       |
//            |                         |             component |
//   |ConcreteComponent|    |       Decorator       |-----------+
//   |-----------------|    |-----------------------|
//   |Operation()      |    |Operation()            |
//                          |  component.Operation()|
//                                      ^
//                                      |
//                        +-------------+----------+
//                        |                        |
//               |ConcreteDecoratorA|  |   ConcreteDecoratorB  |
//               |------------------|  |-----------------------|
//               |Operation()       |  |Operation()            |
//               |------------------|  | Decorator::Operation()|
//               |added_state       |  | AddedBehavior()       |
//                                     |AddedBehavior()        |
//
//+------------------------------------------------------------------+
// 对象的接口, 可以动态添加职责
class Component
{public:virtual void      Operation(void)=0;
};
// 装饰器, 符合组件的接口, 对组件对象的引用
class Decorator:public Component
{public:Component*        component;void              Operation(void);
};
//
void Decorator::Operation(void)
{if (CheckPointer(component) > 0){component.Operation();}
}
// 定义--对象--可以附加额外责任的对象
class ConcreteComponent:public Component
{public:void              Operation(void);
};
//
void ConcreteComponent::Operation(void)
{Print("concrete operation");
}
// 为组件添加职责
class ConcreteDecoratorA:public Decorator
{protected:string            added_state;public:ConcreteDecoratorA(void);void              Operation(void);
};
//+------------------------------------------------------------------+
//| participants > concrete decorator > a                            |
//+------------------------------------------------------------------+
ConcreteDecoratorA::ConcreteDecoratorA(void) : added_state("added state")
{}
//+------------------------------------------------------------------+
//| participants > concrete decorator > a                            |
//+------------------------------------------------------------------+
void ConcreteDecoratorA::Operation(void)
{Decorator::Operation();Print(added_state);
}
//+------------------------------------------------------------------+
//| participants > concrete decorator > b                            |
//+------------------------------------------------------------------+
class ConcreteDecoratorB : public Decorator
{public:void              AddedBehavior(void);void              Operation(void);
};
//+------------------------------------------------------------------+
//| participants > concrete decorator > b                            |
//+------------------------------------------------------------------+
void ConcreteDecoratorB::AddedBehavior(void)
{Print("added behavior");
}
//+------------------------------------------------------------------+
//| participants > concrete decorator > b                            |
//+------------------------------------------------------------------+
void ConcreteDecoratorB::Operation(void)
{Decorator::Operation();AddedBehavior();
}
//+------------------------------------------------------------------+
//| participants > client                                            |
//+------------------------------------------------------------------+
class Client:public ClientInterface
{public:string            Output(void);void              Run(void);
};
string Client::Output(void) {return __FUNCTION__;}
//+------------------------------------------------------------------+
//| collaborations                                                   |
//+------------------------------------------------------------------+
void Client::Run(void)
{Component* component = new ConcreteComponent();Decorator* decorator_a = new ConcreteDecoratorA();Decorator* decorator_b = new ConcreteDecoratorB();decorator_a.component = component;decorator_b.component = decorator_a;decorator_b.Operation();//---delete component;delete decorator_a;delete decorator_b;
}
//+------------------------------------------------------------------+
//| related patterns                                                 |
//+------------------------------------------------------------------+
// 适配器模式 -> 将为对象提供一个全新的接口
// 装饰器模式 -> 更改对象的职责,而不是其接口
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() 
{//---structuralRun(new Decorator::Client);
}
//+------------------------------------------------------------------+
//| output                                                           |
//+------------------------------------------------------------------+
//   Decorator::Client::Output
//   concrete operation
//   added state
//   added behavior
//+------------------------------------------------------------------+

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

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

相关文章

【Linux】日志的实现——日志等级的分类、日志的实现和输出、日志在程序中的应用(以管道通信为例)

文章目录 日志实现1.日志的介绍2.日志的制作&#xff08;向屏幕直接打印&#xff09;2.1获取时间2.2输出内容2.3打印方式2.3.1向单个文件打印2.3.2向分类文件打印 3.日志的应用3.1以管道通信为例 日志实现 1.日志的介绍 Linux日志是以时间线-事件的方式记录操作系统和应用的信…

【软件工程】建模工具之开发各阶段绘图——UML2.0常用图实践技巧(功能用例图、静态类图、动态序列图状态图活动图)

更多示例图片可以参考&#xff1a;&#xff08;除了常见的流程图&#xff0c;其他都有&#xff09; 概念&#xff1a;类图 静态&#xff1a;用例图 动态&#xff1a;顺序图&状态图&活动图 1、【面向对象】UML类图、用例图、顺序图、活动图、状态图、通信图、构件图、部…

Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言 在使用 Redis 是&#xff0c;经常会遇到一个问题&#xff1a;明明做了数据删除&#xff0c;数据量不大&#xff0c;但是 使用 top 命令查看时&#xff0c;发现 Redis 还是占用了很多内存。 这是因为&#xff0c;当删除数据后&#xff0c;Redis 释放的内存空间会由内存分…

项目工程在Debug下编译仍然无法进入断点调试

无法进入断点可能原因 1.cmakelist 1.cmakelist 链接库时&#xff0c;添加-s&#xff0c;用于生成striped文件&#xff0c;导致把调试信息删除(去除“no debugging symbols found”提示&#xff0c;不能有-s选项,-s作用具体参考链接)

《数字化运维路线图》第三部分-数字化运维转型平台 震撼发布!

数字化转型已不再是企业追求效益最大化的手段&#xff0c;而是成为经济发展变革、提升国家数字竞争的核心动力。在此背景下&#xff0c;博睿数据继续发力&#xff0c;隆重推出「数字化运维转型平台」&#xff0c;汇聚了我们对数字化转型的深刻洞见与实践经验&#xff0c;以期为…

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用工厂方法模式 创建 飞船模型&#xff0c; 首先资源商店下载飞船模型&#xff0c…

《区块链简易速速上手小册》第6章:区块链在金融服务领域的应用(2024 最新版)

文章目录 6.1 金融服务中的区块链6.1.1 金融服务中区块链的基础6.1.2 主要案例&#xff1a;跨境支付6.1.3 拓展案例 1&#xff1a;去中心化金融&#xff08;DeFi&#xff09;6.1.4 拓展案例 2&#xff1a;代币化资产 6.2 区块链在支付系统中的作用6.2.1 支付系统中区块链的基础…

Kong 速率限制

速率限制用于控制发送到上游服务的请求速率。它可以用于防止拒绝服务&#xff08;DoS&#xff09;攻击、限制网络爬虫以及其他形式的滥用行为。没有速率限制&#xff0c;客户端可以无限制地访问您的上游服务&#xff0c;可能会对可用性产生负面影响。 速率限制插件 Kong Gate…

Linux - iptables 防火墙

一. 安全技术和防火墙 1.安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全…

专业数据治理:数据中台系统塑造企业未来的数字化运营管理新秩序

随着信息化进程的快速推进&#xff0c;数据已然成为企业最为宝贵的资产。对于众多企业而言&#xff0c;如何有效整合、治理以及充分利用这些数据&#xff0c;使之成为推动业务发展的引擎&#xff0c;成为当前难题。数据中台应运而生&#xff0c;它被认为是企业数字化转型的至关…

元素的显示与隐藏,精灵图,字体图标,CSSC三角

元素的显示与隐藏 类似网站广告&#xff0c;当我们点击关闭就不见了&#xff0c;但是我们重新刷新页面&#xff0c;会重新出现 本质&#xff1a;让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性&#xff08;…

远EC600E-CN LTE Standard模块硬件设计手册

EC600E-CN是一款LTE-FDD、LTE-TDD无线通信模块&#xff0c;支持LTE-FDD和LTE-TDD数据连接&#xff0c;可为客户在特定场景应用中提供语音功能。 模块封装紧凑&#xff0c;仅为22.9mm21.9mm2.4mm&#xff0c;能满足大部分M2M应用需求&#xff0c;例如自动化领域、智能计量、跟踪…

IP网络对讲系统高清可视寻呼话筒管理中心主机10寸大屏有线呼叫器监狱看守所监狱收费站可视对讲系统

SV-2017P网络可视话筒产品简介 产品特点 专业寻呼主机外形&#xff0c;桌面式设计&#xff0c;采用10.1寸高清IPS屏幕&#xff0c;分辨率1280*720&#xff0c;全虚拟按键加实体按键&#xff0c;外形美观大方&#xff1b;采用工业级4核嵌入式CPU芯片1G内存&#xff0c;保证系统…

计算机网络(第六版)复习提纲24

3 传输控制协议TCP概述 A TCP最主要的特点 1 面向连接的传输层协议 2 每一条TCP连接只能有两个端点&#xff0c;且只能是点对点的 3 提供可靠交付的服务&#xff08;无差错、不丢失、不重复、不乱序&#xff09; 4 全双工通信&#xff0c;两端设有发送缓存和接收缓存 5 面向字节…

arcgis自定义dem高程实现地形抬高 - 操作矢量,转tin、adf(tif),cesiumlab切高程服务

这次记录分享一下arcgis自定义高程全过程 /(ㄒoㄒ)/~~ 我的场景&#xff1a;前端实现地面抬高效果 自定义高程实现地形抬高 一、数据处理 - arcgis操作矢量1、准备工作&#xff08;可选&#xff09;2、绘制外围矢量&#xff08;可选&#xff09;3、操作矢量数据 二、创建tin - …

HTTP请求传递参数方式【2024-02-01】

1、HTTP请求传递参数分类 1.1、按照请求方式分类 GET方法:通过查询字符串&#xff08;Query String&#xff0c;每个参数由参数名和参数值组成&#xff0c;使用等号 连接&#xff0c;不同参数之间使用 & 符号分隔&#xff09;的方式或直接将参数放在URL中来传递参数POST…

VUE PC端可拖动悬浮按钮

一、实现效果&#xff1a; 二、FloatButton.vue <template><div><div class"sssss"><div class"callback float" mousedown"down" touchstart"down" mousemove"move" touchmove"move" mous…

C语言——柔性数组

柔性数组概念&#xff1a; 这个概念你可能没听说过&#xff0c;但是这个概念确实存在&#xff0c;在C99中&#xff0c;结构体中最后一个成员允许是未知大小的数组&#xff0c;这就叫做【柔性数组】成员。 struct S {char c;int i;int arr[0];//未知大小的数组 - 柔性数组成员 }…

深度学习入门笔记(三)常用AI术语

本节我们介绍一些深度学习领域常用的术语。 训练 确定模型中的参数的过程,我们就称为“训练”。 Epoch 遍历一遍训练数据就叫作“一个 Epoch”。训练模型的时候,我们要告诉模型预计训练多少个 Epoch,但这个值并不是固定的,因为并没有一个准确的 Epoch 数能一定能得到一…

Java项目:基于SSM框架实现的西安旅游管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm811基于SSM框架实现的西安旅游管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…