新版MQL语言程序设计:外观模式的原理、应用及代码实现
文章目录
- 一、什么是外观模式
- 二、外观模式的实现原理
- 三、外观模式的应用范围
- 四、外观模式应用实例
- 银行系统的设计
- 量化交易系统的设计
- 五、外观模式的代码实现
一、什么是外观模式
外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互,而不需要了解子系统的内部实现细节。
二、外观模式的实现原理
-
定义外观类(Facade):外观类是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求委派给适当的子系统对象。外观类可以根据需要进行封装,提供简化的接口给客户端使用。
-
定义子系统类(Subsystem):子系统类是外观模式中的各个组成部分,它们实现了子系统的功能。每个子系统类都处理一个或多个相关的任务,但是这些任务对于客户端来说是透明的。
-
客户端调用外观类:客户端通过调用外观类的方法来完成所需的功能。客户端不需要直接与子系统类交互,而是通过外观类间接地与子系统进行通信。
外观模式可以帮助客户端简化与复杂子系统的交互过程,提供了一种简单、统一的接口,使得客户端更加方便地使用子系统功能。
三、外观模式的应用范围
-
简化复杂系统:当一个系统变得非常复杂,包含多个子系统时,可以使用外观模式来提供一个简化的接口,使得客户端可以更方便地使用系统。
-
解耦客户端和子系统:外观模式将客户端与子系统解耦,客户端只需要与外观对象进行交互,而不需要直接与子系统中的各个对象进行交互。
-
封装子系统:外观模式可以将子系统的实现细节隐藏起来,只暴露必要的接口给客户端使用,提高了系统的安全性和稳定性。
-
提供简单接口:外观模式可以为复杂的子系统提供一个简单的接口,使得客户端可以更容易地理解和使用系统。
-
实现子系统间的松耦合:外观模式可以将多个子系统进行组合,实现它们之间的松耦合关系,从而提高系统的灵活性和可维护性。
四、外观模式应用实例
银行系统的设计
在金融行业中,一个常见的应用是银行系统的外观模式。银行系统通常包含多个子系统,如账户管理、交易处理、贷款服务等。每个子系统都有自己的接口和实现逻辑。而客户端在使用银行系统时,可能需要同时调用多个子系统的功能。
通过使用外观模式,银行系统可以提供一个统一的接口给客户端使用,客户端只需要与外观对象进行交互,而不需要直接与各个子系统进行交互。外观对象封装了各个子系统的复杂逻辑,对外提供简单的接口,使得客户端可以更方便地使用银行系统的功能。
例如,客户端可能需要查询账户余额、进行转账操作和申请贷款。在没有外观模式的情况下,客户端需要分别与账户管理子系统、交易处理子系统和贷款服务子系统进行交互。而通过引入外观模式,银行系统可以提供一个名为BankFacade的外观对象,客户端只需要与BankFacade进行交互即可完成上述操作。
BankFacade封装了账户管理子系统、交易处理子系统和贷款服务子系统的具体实现细节,对外提供了查询账户余额、转账和申请贷款等简单接口。客户端只需要通过BankFacade调用相应的接口,BankFacade内部会根据具体的业务需求调用相应的子系统进行处理。
通过外观模式,银行系统可以提供一个简单、统一的接口给客户端使用,隐藏了子系统的复杂性,提高了系统的可维护性和可扩展性。
量化交易系统的设计
假设我们有一个量化交易系统,其中包含了多个模块,如数据获取模块、策略选择模块、交易执行模块等。每个模块都有自己的接口和实现逻辑。如果直接暴露这些模块的接口给用户,用户可能需要了解每个模块的具体实现细节,使用起来会比较复杂。
而通过外观模式,我们可以定义一个交易系统外观类,该类封装了底层各个模块的接口,并提供了一个简单的接口给用户使用。用户只需要与外观类进行交互,而不需要了解底层模块的具体实现。
例如,用户可以通过外观类的接口来获取市场数据、选择策略、执行交易等操作,而不需要直接与数据获取模块、策略选择模块、交易执行模块等进行交互。外观类内部会根据用户的请求,调用相应的底层模块来完成具体的操作。
如此,用户只需要了解外观类的接口和使用方法,而不需要了解底层模块的复杂实现逻辑,大大简化了用户的操作和学习成本。
五、外观模式的代码实现
//+------------------------------------------------------------------+
//| interface — for patterns |
//+------------------------------------------------------------------+
interface ClientInterface //pattern client
{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
}
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem a |
//+------------------------------------------------------------------+
class SubSystemA
{public:void Operation(void);
};
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem a > opereation |
//+------------------------------------------------------------------+
void SubSystemA::Operation(void)
{Print("subsystem a > operation");
}
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem b |
//+------------------------------------------------------------------+
class SubSystemB
{public:void Operation(void);
};
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem b > opereation |
//+------------------------------------------------------------------+
void SubSystemB::Operation(void)
{Print("subsystem b > operation");
}
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem c |
//+------------------------------------------------------------------+
class SubSystemC
{public:void Operation(void);
};
//+------------------------------------------------------------------+
//| participants > subsystem classes > subsystem c > opereation |
//+------------------------------------------------------------------+
void SubSystemC::Operation(void)
{Print("subsystem c > operation");
}
// 知道哪些子系统类负责请求
// 将客户端请求委托给适当的子系统对象
class Facade
{public:void OperationAB(void);void OperationBC(void);protected:SubSystemA subsystem_a;SubSystemB subsystem_b;SubSystemC subsystem_c;
};
//+------------------------------------------------------------------+
//| participants > facade > operation a—b |
//+------------------------------------------------------------------+
void Facade::OperationAB(void)
{Print("facade > operation a & b");Print("facade > requesting > subsystem a > operation");subsystem_a.Operation();Print("facade > requesting > subsystem b > operation");subsystem_b.Operation();
}
//+------------------------------------------------------------------+
//| participants > facade > operation b—c |
//+------------------------------------------------------------------+
void Facade::OperationBC(void)
{Print("facade > operation b & c");Print("facade > requesting > subsystem b > operation");subsystem_b.Operation();Print("facade > requesting > subsystem c > operation");subsystem_c.Operation();
}
//+------------------------------------------------------------------+
//| participants > client |
//+------------------------------------------------------------------+
class Client:public ClientInterface
{public:string Output(void);void Run(void);
};
string Client::Output(void)
{return __FUNCTION__;
}
//+------------------------------------------------------------------+
//| collaborations |
//+------------------------------------------------------------------+
void Client::Run(void)
{Facade facade;Print("client > requesting > facade operation a & b");facade.OperationAB();Print("client > requesting > facade operation b & c");facade.OperationBC();
}
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
// launch pattern clients one by one — check result
void OnStart()
{//---structuralRun(new Client);
}
//+------------------------------------------------------------------+
//| output |
//+------------------------------------------------------------------+
// Facade::Client::Output
// client > requesting > facade operation a & b
// facade > operation a & b
// facade > requesting > subsystem a > operation
// subsystem a > operation
// facade > requesting > subsystem b > operation
// subsystem b > operation
// client > requesting > facade operation b & c
// facade > operation b & c
// facade > requesting > subsystem b > operation
// subsystem b > operation
// facade > requesting > subsystem c > operation
// subsystem c > operation相关文章:
新版MQL语言程序设计:外观模式的原理、应用及代码实现
文章目录 一、什么是外观模式二、外观模式的实现原理三、外观模式的应用范围四、外观模式应用实例银行系统的设计量化交易系统的设计 五、外观模式的代码实现 一、什么是外观模式 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个…...
Docker 搭建mysql 集群(二)
PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点,数据双向同步的(在任何节点上都可以同时读写) 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…...
L1-018 大笨钟-java
输入样例1: 19:05输出样例1: DangDangDangDangDangDangDangDang输入样例2: 07:05输出样例2: Only 07:05. Too early to Dang. java import java.awt.desktop.SystemEventListener; import java.util.Scanner;public class M…...
monaco-editor布局篇(二)-自动换行
monaco-editor的换行方式,主要分为3种情况: 不换行按照编辑器宽度换行按照制定列数换行 主要受wordwrap和wordwrapcolumn控制,具体如下: 取值含义off不换行,会一直滚动on换行,文本将在视区宽度内自动换行…...
08-常用集合(容器)
上一篇: 07-使用Package、Crates、Modules管理项目 Rust 的标准库包含许多非常有用的数据结构,称为集合。大多数其他数据类型表示一个特定值,但集合可以包含多个值。与内置的数组和元组类型不同,这些集合指向的数据存储在堆上&…...
CentOS 中文乱码
CentOS 中文乱码 1、 查看自己系统有没有安装中文语言包,可使用 locale -a 命令列出所有可用的语言环境 如果有中文,则不用安装,如果没有,需要重新安装,使用 yum install kde-l10n-Chinese 2、 修改 i18n 和 locale…...
Java List中对象根据id去重,并处理重复对象的某个字段
List中对象根据id去重 一、需求二、解决 一、需求 参考文章:https://blog.csdn.net/A_Gui_Code/article/details/106978867 对在list集合中对象根据主键id去重,同时需要对重复对象的某个字段进行单独处理。 例如,对象包含字段如下, 当某个对象重复时&a…...
小周学JAVA—八股六
自动装箱和拆箱 Java中基础数据类型与它们对应的包装类见下表: 原始类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble 装箱:将基础类型转化为包装类型。 拆箱:将包装类型转化为基础类…...
【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)
本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实…...
题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?
lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…...
由亚马逊云科技 Graviton4 驱动的全新内存优化型实例 Amazon EC2 实例(R8g),现已开放预览
下一代 Amazon Elastic Compute CloudAmazon EC2) 实例的预览版现已公开 提供。全新的 R8g 实例 搭载新式 Graviton4 处理器,其性价比远超任何现有的内存优化实例。对于要求较高的内存密集型工作负载,R8g 实例是不二之选:大数据分析、高性能数…...
sqlserver alwayson部署文档手册
1、ALWAYSON概述 详细介绍参照官网详细文档,我就不在这里赘述了: https://learn.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server?viewsql-server-ver16 下图显示的是一个包含一个…...
【FFmpeg】ffplay 命令行参数 ① ( 设置播放分辨率 | 禁用 音频 / 视频 / 字幕 选项 )
文章目录 一、ffplay 命令行参数 - 设置播放分辨率1、强制设置通用播放分辨率 -x -y 参数2、命令行示例 - 正常播放视频3、命令行示例 - 强制设置播放分辨率4、设置 YUV 播放分辨率 -video_size 和 像素设置 -pixel_format5、全屏播放 -fs 参数 二、ffplay 命令行参数 - 禁用 音…...
CSS写渐变边框线条
box-sizing: border-box; border-top: 1px solid; border-image: linear-gradient(to right, red, blue) 1;...
【Linux网络编程三】Udp套接字编程网络应用场景
【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一:远程命令执行应用场景二:与Windos端相互通信应用场景三:简单聊天1.多线程化2.输入输出分开 应用场景一:远程命令执行 简单的服务器上一篇已经完成,接下来我…...
计算机网络实验二
目录 实验二 交换机的基本配置 1、实验目的 2、实验设备 (1)实验内容: (2)练习: 1.实验内容一:(交换机的配置方式) 2.实验内容二:(交换机…...
PS一键磨皮插件Delicious Retouch for mac中文 支持PS2024
Delicious Retouch for Mac是一款优秀的Photoshop插件,专注于人像修饰。以下是该插件的一些主要特点和功能: 软件下载:Delicious Retouch for mac中文 支持PS2024 人像修饰工具:Delicious Retouch专注于人像修饰,提供了…...
信息安全管理措施
本文已收录至《全国计算机等级考试——信息 安全技术》专栏 目的 信息是企业存在和发展的重要基础。为规范企业信息管理,保障信息安全,明确信息安全管理的程序、职责、义务和权限,特制定本制度。 职责 网络管理员(委外…...
『运维备忘录』之 Vim 命令详解
运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…...
Gcc多版本安装和切换
添加本地source sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update安装 gcc9 和 g9(ubuntu18.04) sudo apt-get install gcc-9 gcc-9-multilib g-9 g-9-multilib安装 gcc13 和 g13(ubuntu22.04) sudo …...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...
