欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

命令 - 行为设计模式 - MetaTrader 5 库

author emer | 302 人阅读 | 0 人评论 |
//+------------------------------------------------------------------+
//|                                                      命令.mqh |
//|                                    2019-2020,迪米特里·佩切里察 |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//|命令——行为设计模式                              |
//+------------------------------------------------------------------+
//   设计模式:可重用的面向对象软件的元素
//   gof > 埃里希·伽马、理查德·赫尔姆、拉尔夫·约翰逊、约翰·弗利赛德斯
//   发布 — 1994 年
//+------------------------------------------------------------------+
//|意图                                                           |
//+------------------------------------------------------------------+
//   将请求封装为对象
//    从而让您可以参数化具有不同请求的客户端
//   对请求进行排队或记录,并支持可撤消操作
//+------------------------------------------------------------------+
//|好处                                                         |
//+------------------------------------------------------------------+
//   变量方面 > 何时以及如何满足请求
//   重构
//      问题
//         依赖于具体操作
//         紧耦合
//      解决方案
//         避免硬编码请求 > 另外 > 责任链
//         通过抽象耦合和分层进行解耦
//            也 > 抽象工厂、桥梁、责任链、
//             外观、中介、观察者
//+------------------------------------------------------------------+
//|适用性                                                   |
//+------------------------------------------------------------------+
//   通过要执行的操作来参数化对象
//   在不同时间指定、排队和执行请求
//      命令独立于原始请求
//   支持撤消
//   支持更改日志
//      系统崩溃后重新申请
//      将加载/存储添加到命令中
//      从磁盘重新加载
//      用execute重新执行
//   围绕高级操作构建系统
//    基于原语操作构建
//+------------------------------------------------------------------+
//|结构                                                        |
//+------------------------------------------------------------------+
//
// |客户端|      |祈求者|o-------------------->|命令 |
//   |  |                                      |---------|
//      |                                      |执行()|
//   |  +-------->|接收器|                         ^
//               |--------|      接收器           |
//   |           |动作()|<--------------|  具体命令 |
//                                       |--------------------------------|
//   |                                    |执行()         |
//                                       |接收者.Action()|
//   |                                    |------------------|
//   + - - - - - - - - - - - - - - - - - >|状态             |
//
#包括名称空间命令
{//+------------------------------------------------------------------+
//|参与者 > 接收者                                         |
//+------------------------------------------------------------------+
班级接收者//   知道如何执行请求操作
//   任何类都可以是接收者  {民众:
                     接收者(空白);
                     接收器(接收器&);
  空白              行动(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 接收者 > 默认                                |
//+------------------------------------------------------------------+接收者::接收者(空白)
  {
  }//+------------------------------------------------------------------+
//|参与者 > 接收者 > 复制构造函数                       |
//+------------------------------------------------------------------+接收器::接收器(接收器&src)
  {
  }//+------------------------------------------------------------------+
//|参与者 > 接收者 > 行动                                 |
//+------------------------------------------------------------------+
空白接收者::动作(空白)
  {
  打印“接收者 ”,&,“ 行动”);
  }//+------------------------------------------------------------------+
//|参与者 > 命令                                          |
//+------------------------------------------------------------------+
班级命令//   声明操作接口  {受保护的:
   接收者*         m_receiver;民众:
                     命令(接收者*);
                    〜命令(空白);
  虚拟的 空白      执行(空白)=0;
  };//+------------------------------------------------------------------+
//|参与者 > 命令 > 构造函数                             |
//+------------------------------------------------------------------+命令::命令(接收者*接收者)
  {
   m_接收器=新的接收者(接收者);
  打印“接收者 ”,接收者,“已接受命令”,&);
  }//+------------------------------------------------------------------+
//|参与者 > 命令 > 析构函数                              |
//+------------------------------------------------------------------+命令::~命令(空白)
  {
  如果检查指针(m_接收者)==1)
     {
      删除m_接收器;
     }
  }//+------------------------------------------------------------------+
//|参与者 > 具体命令                                  |
//+------------------------------------------------------------------+
班级具体命令:民众命令//   接收者/动作绑定
//   通过调用接收者操作来实现execute()  {受保护的:
  整数               m_状态;民众:
                     具体命令(接收者*);
  空白              执行(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 具体命令 > 构造函数                    |
//+------------------------------------------------------------------+ConcreteCommand::ConcreteCommand(接收器*接收器):
   命令(接收器),
   m_状态(0)
  {
  打印“命令 ”,&,“ 状态: ”,m_state);
  }//+------------------------------------------------------------------+
//|参与者 > 具体命令 > 执行                        |
//+------------------------------------------------------------------+
空白具体命令::执行(空白)
  {
  打印“命令执行接收者”,m_接收器);
   m_receiver.Action();
   m_状态=1;
  打印“命令 ”,&,“ 状态: ”,m_state);
  }//+------------------------------------------------------------------+
//|参与者 > 调用者                                          |
//+------------------------------------------------------------------+
班级祈求者//  要求命令执行请求  {民众:
                    〜祈求者(空白);
  空白              存储命令(命令*);
  空白              执行(空白);受保护的:
   命令*          m_command;
  };//+------------------------------------------------------------------+
//|参与者 > 调用者 > 析构函数                              |
//+------------------------------------------------------------------+祈求者::~祈求者(空白)
  {
  如果检查指针(m_命令)==1)
     {
      删除m_命令;
     }
  }//+------------------------------------------------------------------+
//|参与者 > 调用者 > 命令                                 |
//+------------------------------------------------------------------+
空白调用者::StoreCommand(命令*命令)
  {
   m_command=命令;
  打印“命令 ”,m_命令,“已存储”);
  }//+------------------------------------------------------------------+
//|参与者 > 调用者 > 执行                                 |
//+------------------------------------------------------------------+
空白调用者::执行(空白)
  {
  打印“执行命令”,m_命令);
   m_command.Execute();
  }//+------------------------------------------------------------------+
//|参与者 > 客户                                           |
//+------------------------------------------------------------------+
班级客户:民众客户端示例//   创建一个具体的命令对象并设置其接收者  {民众:
  细绳            输出(空白);
  空白              跑步(空白);
  };细绳客户端::输出(空白)
  {
  返回 __功能__;
  }//+------------------------------------------------------------------+
//|合作                                                   |
//+------------------------------------------------------------------+
空白客户端::运行(空白//   客户
//      创建一个具体命令
//      指定其接收者
//   调用者
//      通过调用execute()存储具体的命令请求
//      命令可撤消
//         具体命令在execute()之前存储状态
//
//   aReceiver   aClient                    aCommand       anInvoker
//       |          |                          |               |
//       |          |                                          |
//       |         | |newCommand(aReceiver)    |               |
//       |         | |- - - - - - - - - - - >| |              |
//       |         | |                         |               |
//       |         | |StoreCommand(aCommand) |               |
//       |         | |------------------------|-------------->| |
//       |          |                          |              | |
//       |          |                          |               |
//       /          /                         /               /
//       /          /                         /               /
//       |          |                          |               |
//       |          |                          |     执行()| |
//       |          |                 行动()| |<------------| |
//      | |<--------|-------------------------| |             | |
//       |          |                          |               |  {
   接收器接收器;
   调用者调用者;
   调用者.StoreCommand(新的具体命令(&receiver));
   调用者.Execute();
  }
}//+------------------------------------------------------------------+
//|输出                                                            |
//+------------------------------------------------------------------+
//   命令::客户端::输出
//   接收器 2097152 被命令 4194304 接受
//   命令 4194304 状态:0
//   已存储命令 4194304
//  执行命令 4194304
//   命令执行接收器 5242880
//   接收者 5242880 操作
//   命令 4194304 状态:1
//+------------------------------------------------------------------+
//|后果                                                    |
//+------------------------------------------------------------------+
//   解耦操作的调用者/执行者
//  命令是一流的可操作/可扩展对象
//   将命令组装成复合命令
//   轻松添加新命令
//+------------------------------------------------------------------+
//|实施                                                   |
//+------------------------------------------------------------------+
//   命令有多智能
//      绑定接收者/动作
//      不向接收者委托任何内容
//         命令独立于现有类
//         不存在接收者
//         命令知道接收者
//      命令可以动态查找接收者
//   撤消和重做
//      具体命令存储附加状态
//         接收者
//         操作参数
//         接收者的原始值可以改变接收者
//         提供恢复操作
//      多级
//         命令序列的历史列表
//         反向执行以取消
//         可以在将不可撤消的命令放入列表之前复制它
//   撤消中的错误累积
//      延迟可能是一个问题
//      错误会累积
//      使用 memento 在命令中存储更多原始状态
//       用于恢复
//   不可撤销/无参数命令的模板
//+------------------------------------------------------------------+
//|相关模式                                                  |
//+------------------------------------------------------------------+
//   复合 > 实现宏命令
//   备忘录 > 保持命令需要撤消其效果的状态
//   原型 > 必须复制的命令
//    在被放入历史列表之前
//+------------------------------------------------------------------+



附件下载

📎 pattern.mq5 (2.2 KB)

📎 patternorganizer.mqh (16.66 KB)

📎 command.mqh (25.79 KB)

Source: MQL5 #31361

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录