命令 - 行为设计模式 - MetaTrader 5 库
//+------------------------------------------------------------------+ //| 命令.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小时后评论,即可解锁附件下载
立即登录
