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

文章目录

    • 一、什么是外观模式
    • 二、外观模式的实现原理
    • 三、外观模式的应用范围
    • 四、外观模式应用实例
      • 银行系统的设计
      • 量化交易系统的设计
    • 五、外观模式的代码实现

一、什么是外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互,而不需要了解子系统的内部实现细节。

二、外观模式的实现原理

  1. 定义外观类(Facade):外观类是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求委派给适当的子系统对象。外观类可以根据需要进行封装,提供简化的接口给客户端使用。

  2. 定义子系统类(Subsystem):子系统类是外观模式中的各个组成部分,它们实现了子系统的功能。每个子系统类都处理一个或多个相关的任务,但是这些任务对于客户端来说是透明的。

  3. 客户端调用外观类:客户端通过调用外观类的方法来完成所需的功能。客户端不需要直接与子系统类交互,而是通过外观类间接地与子系统进行通信。

外观模式可以帮助客户端简化与复杂子系统的交互过程,提供了一种简单、统一的接口,使得客户端更加方便地使用子系统功能。

三、外观模式的应用范围

  1. 简化复杂系统:当一个系统变得非常复杂,包含多个子系统时,可以使用外观模式来提供一个简化的接口,使得客户端可以更方便地使用系统。

  2. 解耦客户端和子系统:外观模式将客户端与子系统解耦,客户端只需要与外观对象进行交互,而不需要直接与子系统中的各个对象进行交互。

  3. 封装子系统:外观模式可以将子系统的实现细节隐藏起来,只暴露必要的接口给客户端使用,提高了系统的安全性和稳定性。

  4. 提供简单接口:外观模式可以为复杂的子系统提供一个简单的接口,使得客户端可以更容易地理解和使用系统。

  5. 实现子系统间的松耦合:外观模式可以将多个子系统进行组合,实现它们之间的松耦合关系,从而提高系统的灵活性和可维护性。

四、外观模式应用实例

银行系统的设计

在金融行业中,一个常见的应用是银行系统的外观模式。银行系统通常包含多个子系统,如账户管理、交易处理、贷款服务等。每个子系统都有自己的接口和实现逻辑。而客户端在使用银行系统时,可能需要同时调用多个子系统的功能。

通过使用外观模式,银行系统可以提供一个统一的接口给客户端使用,客户端只需要与外观对象进行交互,而不需要直接与各个子系统进行交互。外观对象封装了各个子系统的复杂逻辑,对外提供简单的接口,使得客户端可以更方便地使用银行系统的功能。

例如,客户端可能需要查询账户余额、进行转账操作和申请贷款。在没有外观模式的情况下,客户端需要分别与账户管理子系统、交易处理子系统和贷款服务子系统进行交互。而通过引入外观模式,银行系统可以提供一个名为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

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

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

相关文章

parameter ‘MAX_BYTE‘ used as named parameter override, is a localparam

在驱动模块里把常量定义的 localparam, 然后在顶层文件里面做了修改报错。改成parameter解决 1. localparam在模块内部使用且不能实例化,parameter才可以在实例化的时候修改参数 2. 常量如果在顶层模块和其他模块的值不一样,会使用顶层模块里面的值…

机器学习中的有监督学习和无监督学习

有监督学习 简单来说,就是人教会计算机学会做一件事。 给算法一个数据集,其中数据集中包含了正确答案,根据这个数据集,可以对额外的数据希望得到一个正确判断(详见下面的例子) 回归问题 例如现在有一个…

[SWPUCTF 2021 新生赛]easyupload1.0

发现是上传文件第一想到是文件木马 <?php eval ($_POST[123]);?>木马上传burp修改后缀发现flag里面这个是假的 我们猜想是在phpinfo我们上传<?php eval(phpinfo(););?>木马上传burp修改后缀里面 CtrlF 发现flag

AI智能电销机器人有哪方面的技术优势?

随着科学技术的发展&#xff0c;人工智能逐渐进入了公众的视野&#xff0c;与人工智能相关的智能产品&#xff0c;也从工业革命的诞生开始在生活中不断涌现&#xff0c;虽然说人类没有被机器所取代&#xff0c;但在之后的人工智能时代&#xff0c;人类真的会被取代吗&#xff1…

Linux文件编译

一、GCC编译 我们都知道想要实现一个程序首先需要写好代码让其能运行起来&#xff0c;那么写出来的.c文件是如何被编译出来的呢&#xff1f; 1.直接编译 首先将程序直接编译为可执行文件可以通过Linux中的GCC编译器。 GCC&#xff08;是一套广泛使用的编译器工具集&#xff…

读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior

DiffBIR 发表于2023年的ICCV&#xff0c;是一种基于生成扩散先验的盲图像恢复模型。它通过两个阶段的处理来去除图像的退化&#xff0c;并细化图像的细节。DiffBIR 的优势在于提供高质量的图像恢复结果&#xff0c;并且具有灵活的参数设置&#xff0c;可以在保真度和质量之间进…

[office] sumifs函数和sump #媒体#学习roduct哪个运算更快--Excel函数 #职场发展#媒体

sumifs函数和sumproduct哪个运算更快?-Excel函数 今天&#xff0c;我了解到Excel报表需求看起来像这样&#xff1a; Excel数据库中将维护大约150,000行数据。会有数十个报告&#xff0c;每个报告都有数百种不同的过滤器设置。&#xff08;不同的产品&#xff0c;部门等&…

解决The Tomcat connector configured to listen on port 8080 failed to start

问题 启动javar报错&#xff0c;提示如下 Description: The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured. Action: Verify the connector’s configuration, identify a…

【论文笔记】Lift-Attend-Splat: Bird’s-eye-view camera-lidar fusion using transformers

原文链接&#xff1a;https://arxiv.org/abs/2312.14919 1. 引言 多模态融合时&#xff0c;由于不同模态有不同的过拟合和泛化能力&#xff0c;联合训练不同模态可能会导致弱模态的不充分利用&#xff0c;甚至会导致比单一模态方法性能更低。 目前的相机-激光雷达融合方法多基…

【JMeter】使用技巧

在这此对新版本jmeter的学习温习的过程&#xff0c;发现了一些以前不知道的功能&#xff0c;所以&#xff0c;整理出来与大分享。本文内容如下。 如何使用英文界面的jmeter如何使用镜像服务器Jmeter分布式测试启动Debug 日志记录搜索功能线程之间传递变量 如何使用英文界面的…

Vite 的全景:颠覆前端开发的新潮流

Vite 的全景:颠覆前端开发的新潮流 1. 简介 在现代前端开发领域,Vite已经成为一种引人注目的选择。Vite是一种快速、简单、可扩展的构建工具,为前端开发者提供了高效的开发体验。让我们一起深入了解这个令人兴奋的技术。 1.1 定义和概述 Vite是一个基于Vue.js的构建工具…

YOLO部署实战(5):NVIDIA Jetson Tx2部署YOLO

1 一些概念 Jetson Tx2 NVIDIA Jetson 是NVIDIA为新一代自主机器设计的的嵌入式系统&#xff0c;是一个AI平台&#xff0c;它的优势就是可以覆盖不同领域、不同行业。目前Jetson产品线已经有四个产品系列&#xff0c;包括Jetson Nano、Jetson TX2、Xavier NX和AGX Xavier。四…

MySQL温故篇(一)SQL语句基础

一、SQL语句基础 1、SQL语言分类 DDL&#xff1a;数据定义语言 DCL&#xff1a;数据控制语言 DML&#xff1a;数据操作语言 DQL&#xff1a;数据的查询语言 2、数据类型 3、字符类型 char(11) &#xff1a; 定长 的字符串类型,在存储字符串时&#xff0c;最大字符长度11个&a…

【HarmonyOS应用开发】HTTP数据请求(十四)

文章末尾含相关内容源代码 一、概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么…

【分享】我的调试nRF2401时的一些心得

无线传输,好处很多.记得调试的第一块数传模块是nRF2401.那时我在做个小项目&#xff08;液位自动控制装置&#xff09;的时候&#xff0c;用到这对nRF2401.下面就说下调试nRF2401的调试过程遇到的问题。 MSP430F149&#xff08;两块&#xff09; nRF2401(一对)4*4键盘&#xf…

计算机网络——03网络核心

网络核心 网络核心 网络核心&#xff1a;路由器的网络状态基本问题&#xff1a;数据怎样通过网络进行传输 电路交换&#xff1a;为每个呼叫预留一条专有电路分组交换 将要传送的数据分成一个个单位&#xff1a;分组将分组从一个路由器传到相邻路由器&#xff08;hop&#xff…

101 C++内存高级话题 内存池概念,代码实现和详细分析

零 为什么要用内存池&#xff1f; 从前面的知识我们知道&#xff0c;当new 或者 malloc 的时候&#xff0c;假设您想要malloc 10个字节&#xff0c; char * pchar new char[10]; char *pchar1 malloc(10); 实际上编译器为了 记录和管理这些数据&#xff0c;做了不少事情&…

01-Datahub是什么?

Datahub是LinkedIn开源的基于现代数据栈的元数据管理平台&#xff0c;原来叫做WhereHows 。经过一段时间的发展datahub于2020年2月在Github开源。 官网地址为&#xff1a;A Metadata Platform for the Modern Data Stack | DataHub 源码地址为&#xff1a;GitHub - datahub-p…

easyexcel解析跨多行的数据

在使用easyexcel计息excel文件的时候&#xff0c;存在某列横跨多行&#xff0c;这是要怎么解决呢&#xff1f;代码如下 定义实体对应excel文件 public class EtcParkingReconciliationDailyImportModel implements Serializable {/** 创建时间 */private String insertTime L…

幻兽帕鲁联机服务器 - 小白部署教程

简介&#xff1a; 本文将基于阿里云&#xff0c;介绍如何最低以24元的成本拥有一台幻兽帕鲁私人服务器 1. 基础部署幻兽帕鲁服务器 1.1 访问帕鲁专题活动页 首先登录阿里云官网&#xff1a;阿里云特惠专区-幻兽帕鲁专属云服务器 用钉钉或者支付宝app扫码注册新用户&#xff…