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

文章目录

    • 一、什么是策略模式
    • 二、策略模式的实现原理
    • 三、策略模式的应用场景
    • 四、策略模式的代码实现

一、什么是策略模式

策略模式是一种行为型设计模式,它允许在运行时根据不同的情况选择算法的行为。该模式将算法封装成独立的类,并使它们可以互相替换,从而使算法的变化独立于使用算法的客户端。

二、策略模式的实现原理

  1. 定义一个策略接口:首先需要定义一个策略接口,该接口声明了算法的方法。
  2. 实现具体策略类:针对不同的算法,实现具体的策略类,这些类都实现了策略接口,并提供了自己的算法实现。
  3. 在客户端使用策略:在客户端代码中,创建一个策略对象,并将其传递给需要使用算法的对象。客户端代码不需要关心具体的算法实现,只需要知道如何使用策略对象即可。
  4. 运行时动态切换策略:由于策略对象是可以相互替换的,因此在运行时可以根据需要动态切换策略对象,从而改变算法的行为。

通过使用策略模式,可以将算法的实现与客户端代码解耦,使得算法可以独立变化,而不影响客户端代码的稳定性和可维护性。

三、策略模式的应用场景

  1. 当一个系统需要在多个算法中选择一个进行使用时,可以使用策略模式。例如,一个电商平台可能需要根据用户的购买记录选择不同的推荐算法。
  2. 当一个类有多个行为或算法,并且这些行为或算法可能在未来发生变化时,可以使用策略模式。通过将每个行为或算法封装成一个策略类,可以方便地添加、修改或删除这些行为或算法。
  3. 当一个系统需要动态地切换算法时,可以使用策略模式。例如,一个游戏中的角色可能需要根据当前状态选择不同的攻击策略。
  4. 当一个系统需要对外提供一组可替换的算法时,可以使用策略模式。通过定义一个公共接口,并让每个策略类实现该接口,可以方便地切换不同的算法。

四、策略模式的代码实现

//   structure
//
//                        strategy
//   |     Context      |o-------->|      Strategy      |
//   |------------------|          |--------------------|
//   |ContextInterface()|          |AlgorithmInterface()|
//                                           ^
//                                           |
//                  +------------------------+----------------------+
//                  |                        |                      |
//        | ConcreteStrategyA  |  | ConcreteStrategyB  |  | ConcreteStrategyC  |
//        |--------------------|  |--------------------|  |--------------------|
//        |AlgorithmInterface()|  |AlgorithmInterface()|  |AlgorithmInterface()|
//
interface Strategy
{void AlgorithmInterface(void);
};
//
class ConcreteStrategyA : public Strategy
{public:void              AlgorithmInterface(void);
};
//
void ConcreteStrategyA::AlgorithmInterface(void)
{Print("executing algorithm of strategy a (",&this,")");
}
//
class ConcreteStrategyB : public Strategy
{public:void              AlgorithmInterface(void);
};
//
void ConcreteStrategyB::AlgorithmInterface(void)
{Print("executing algorithm of strategy b (",&this,")");
}
//
class ConcreteStrategyC : public Strategy
{public:void              AlgorithmInterface(void);
};
//
void ConcreteStrategyC::AlgorithmInterface(void)
{Print("executing algorithm of strategy c (",&this,")");
}
//
class Context
{public:Context(Strategy& strategy);~Context(void);void              ContextInterface(void);protected:Strategy*         m_strategy;
};
//
Context::Context(Strategy &strategy)
{m_strategy = &strategy;Print("new strategy ", &strategy, " loaded");
}
//
Context::~Context()
{if (CheckPointer(m_strategy) == 1)delete m_strategy;
}
//
void Context::ContextInterface(void)
{Print("requesting strategy algorithm");m_strategy.AlgorithmInterface();
}
//
void OnStart()
{Context *context;//---strategy acontext=new Context(new ConcreteStrategyA());context.ContextInterface();delete context;//---strategy bcontext = new Context(new ConcreteStrategyB());context.ContextInterface();delete context;//---strategy ccontext = new Context(new ConcreteStrategyC());context.ContextInterface();delete context;
}
//   output
//
//   new strategy 2097152 loaded
//   requesting strategy algorithm
//   executing algorithm of strategy a (2097152)
//   new strategy 4194304 loaded
//   requesting strategy algorithm
//   executing algorithm of strategy b (4194304)
//   new strategy 6291456 loaded
//   requesting strategy algorithm
//   executing algorithm of strategy c (6291456)

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

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

相关文章

web3之跨链合成资产交易协议LINA (Linear)

什么是lina 官方网站:https://linear.finance/ Website: https://linera.io Discord: https://discord.gg/linera Medium: https://medium.com/linera Developer Docs: https://linera.dev Whitepaper: https://linera.io/whitepaper Linear Finance是首个跨链兼容…

会声会影绿幕抠图操作方法 会声会影绿幕抠图有绿色残边 绿幕抠图视频有绿边怎么处理 抖音怎么剪辑视频 视频剪辑软件推荐

科幻片里真的存在怪兽吗?外太空的画面是直接将演员放入太空拍摄的吗?其实这些不切实际的画面是通过绿幕拍摄实现的。你只需要在绿幕前拍一段太空漫步的视频,再利用会声会影的抠图功能就能实现!如果你还不会绿幕抠图,我今天就手把…

《杨绛传:生活不易,保持优雅》读书摘录

目录 书简介 作者成就 书中内容摘录 良好的家世背景,书香门第为求学打基础 求学相关 念大学 清华研究生 自费英国留学 法国留学自学文学 战乱时期回国 当校长 当小学老师 创造话剧 支持钱锺书写《围城》 出任震旦女子文理学院的教授 接受清华大学的…

C/C++ 关于 SHA256 的使用

如下图&#xff0c;是关于 SHA256 使用的一个经典例子 #include <openssl/sha.h> #include <stdio.h> #include <string.h>int main() {char data[] "Hello, world!"; // 要计算哈希的数据unsigned char hash[SHA256_DIGEST_LENGTH]; // 用于存储…

扑克牌大小(模拟)

题目 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();String[] ss s.split("-");StringBuffer s1 new StringBuffer();StringBuffer s2 new StringBuffer(…

C++函数对象-运算符函数对象 - 逻辑运算 - 实现 x y 的函数对象 (std::logical_and)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 运算符函数对象 C 针对常用的算术和逻辑运算定义了很多函数对象&#xff1a; 逻辑运算 实现 x && y 的函数对象 std::logical_and templa…

关于基因结构注释,我的一些折腾和思考

我在2018年,写过一篇《如何对基因组序列进行注释》,简书上有4万多人阅读,CSDN上有8万多人阅读,说明确实有不少人有相关的需求。我自己也琢磨了一段时间,刚好过年回家,简单的梳理一下。 最初的时候,我的思路就是EvidenceModeler(后面简称EVM)的思路,训练不同从头预测…

微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 目录 前言 通过代码实现限流 定义资源 通过代码定义资源 通过注解方式定义资源 定义限流规则 通过…

nginx 配置404 页面

自己定义404 页面&#xff0c;通过 nginx 配置一下&#xff0c;重新定向 1. http 里面添加配置 proxy_intercept_errors on; fastcgi_intercept_errors on; 2. server 中添加配置 error_page 500 502 503 504 /404.html;error_page 404 /404.html;location /404.html…

cximage在vs2013下使用方法

1.下载源码 Cximage源码官网 CxImage download | SourceForge.net 下载最新版本 702版本 Download cximage702_full.7z (CxImage) 2.编译 vs2013打开CxImageFull_vc10.sln 这个源码版本是vc10的版本&#xff0c;所以vs2013会自动更新项目 因为cximage需要在后面的项目中使…

Nginx实战:2-日志配置

目录 前言 一、访问日志 1.字段配置 2.日志配置 3.默认配置 二、错误日志 前言 Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP服务器。在Nginx的日常使用中&#xff0c;日志记录是非常重要的一部分&#xff0c;它可以帮助我们监控服务…

2月7日《CS2》终于放大招,玩家激情再次被点燃

2024.2.7号&#xff0c;也就是昨天&#xff0c;V社终于放了大招&#xff0c;对CS2做了高达5个多G的大更新&#xff0c;这次更新内容还是比较多的&#xff0c;说几个比较有意思的点吧。 1、新武器箱&#xff1a;千瓦武器箱&#xff01; 全新的武器箱千瓦箱&#xff0c;能开出全…

java 回答问题

1. How do you create a variable with the numeric value 5? int x 5; 2. The value of a string variable can be surrounded by single quotes. False 3. Which method can be used to return a string in upper case letters? toUpperCase()

AutoSAR(基础入门篇)5.4-Autosar_汽车ECU项目的开发流程

目录 前言 一、团队介绍 二、AutoSAR开发流程 前言 项目的基础入门篇终于是要讲完了(后面可能还有一些补充内容)。大家耐着性子能看到这里也是真心不容易,AutoSAR很多内容都是理论上的东 西,还需要多加实践。所以如果你能认真看完前面的内容,并加以理解,那么我相信再看…

Netty应用(一) 之 NIO概念 基本编程

目录 第一章 概念引入 1.分布式概念引入 第二章 Netty基础 - NIO 1.引言 1.1 什么是Netty&#xff1f; 1.2 为什么要学习Netty&#xff1f; 2.NIO编程 2.1 传统网络通信中开发方式及问题&#xff08;BIO&#xff09; 2.1.1 多线程版网络编程 2.1.2 线程池版的网络编程…

搭建yum仓库服务器

安装 1.安装linux 1.1安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 1.2下载 cd /opt/nginx wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.3解压 tar -xvf nginx-1.25.3.tar.gz 1.4配置 cd nginx-1.25.3 ./configure --pre…

FTP 文件传送协议

目录 1 文件传送协议 FTP 1.1 FTP 的基本工作原理 FTP 特点 主进程的工作步骤 两个连接 两个不同的端口号 NFS 采用另一种思路 1.2 简单文件传送协议 TFTP TFTP 的主要特点 TFTP 的工作&#xff08;很像停止等待协议&#xff09; 1 文件传送协议 FTP 文件传送协议 …

Redisson分布式锁 原理 + 运用 记录

Redisson 分布式锁 简单入门 pom <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>配置类 package com.hmdp.config;import org.redisson.Redisson;…

NLP_引入注意力机制

文章目录 点积注意力创建两个张量x1和x2计算张量点积&#xff0c; 得到原始权重对原始权重进行归一化求出注意力分布的加权和 缩放点积注意力编码器-解码器注意力定义Attention类重构Decoder类重构Seq2Seq类可视化注意力权重 注意力机制中的 Q、K、V自注意力多头自注意力注意力…

CSS 2D转换 3D动画 3D转换

目录 2D转换(transform): 移动translate: 旋转rotate: 缩放scale&#xff1a; CSS3动画&#xff08;transform&#xff09;&#xff1a; 动画常用的属性&#xff1a; 将长图片利用盒子实现动画的效果&#xff1a; 3D转换&#xff1a; 透视perspective&#xff1a; 旋转r…