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

Bridge - 结构设计模式 - MetaTrader 5 库

author emer | 827 人阅读 | 0 人评论 |
//+------------------------------------------------------------------+
//|                                                       桥.mqh |
//|                                     2019-2020,德米特里·佩切里察 |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//|桥梁 > 结构设计模式                               |
//+------------------------------------------------------------------+
//   设计模式:可重用的面向对象软件的元素
//   gof > 埃里希·伽马、理查德·赫尔姆、拉尔夫·约翰逊、约翰·弗利赛德斯
//   发表于 1994 年
//+------------------------------------------------------------------+
//|意图                                                           |
//+------------------------------------------------------------------+
//   抽象和实现 > 解耦,独立变化
//+------------------------------------------------------------------+
//|好处                                                         |
//+------------------------------------------------------------------+
//   变量方面 > 对象的实现
//   重构问题
//      对硬件和软件平台的依赖
//      对对象表示/实现的依赖
//      紧耦合
//      通过子类化扩展功能
//   重构解决方案
//      限制平台依赖性
//         还 > 抽象工厂、桥
//      隐藏客户端的依赖以防止级联更改
//         还 > 抽象工厂、桥、备忘录、代理
//      通过抽象耦合和分层进行解耦
//         还
//            抽象工厂、桥梁、责任链、
//            命令、外观、中介、观察者
//      组合/委托
//         组合行为比继承更灵活
//         还
//            桥梁、责任链、复合、装饰器、
//            观察者、策略
//+------------------------------------------------------------------+
//|适用性                                                   |
//+------------------------------------------------------------------+
//   抽象/实现
//      未绑定 > 在运行时切换实现
//      可通过子类化>独立组合/扩展来扩展
//   抽象的实现
//      更改对客户端没有影响(无需重新编译)
//      可以在 C++ 中对客户端隐藏
//   类的增殖 > 将对象分成两部分
//   实现可以在多个对象之间共享(引用计数)
//+------------------------------------------------------------------+
//|结构                                                        |
//+------------------------------------------------------------------+
//
//|客户端|
//   |
//   +-->|   抽象  |----------------->|实施者 |
//       |----------------|                  |--------------|
//       |操作()     |                  |操作Imp()|
//       | imp.Operation()|                         ^
//               ^                                 |
//               |                       +----------+----------+
//               |                       |                     |
//      |精致抽象|  |具体实现者A| |具体实施者B|
//                            |--------------------| |--------------------|
//                            |OperationImp()      | |OperationImp()      |
//
#包括名称空间桥
{//+------------------------------------------------------------------+
//|参与者                                                     |
//+------------------------------------------------------------------+
界面实施者//   定义实现类的接口
//   实现者接口仅提供原始操作
//   抽象基于这些原语定义了更高级别的操作  {
  空白操作Imp(空白);
  };//+------------------------------------------------------------------+
//|参与者                                                     |
//+------------------------------------------------------------------+
班级抽象//   定义抽象的接口
//   维护对实现者类型的对象的引用  {民众:
  虚拟的 空白      手术(空白);
                     抽象(实现者*);
                     抽象(空白);
                    〜抽象(空白);受保护的:
   实施者*      实施者;
  };空白抽象::抽象(空白){}//+------------------------------------------------------------------+
//|参与者 > 抽象                                      |
//+------------------------------------------------------------------+
空白抽象::抽象(实现者*i):实现者(i)
  {
  打印“由实现者创建的抽象”,我);
  打印“实施者”,我,“通过抽象来保存”);
  }//+------------------------------------------------------------------+
//|参与者 > 抽象                                      |
//+------------------------------------------------------------------+
空白抽象::~抽象(空白)
  {
  删除实施者;
  }//+------------------------------------------------------------------+
//|参与者 > 抽象                                      |
//+------------------------------------------------------------------+
空白抽象::操作(空白)
  {
  打印“抽象是在自己的操作中要求其实现者”,
         实施者,“依次运行其操作”);
   实现者.OperationImp();
  }//+------------------------------------------------------------------+
//|参与者                                                     |
//+------------------------------------------------------------------+
班级精炼抽象:民众抽象//   扩展抽象定义的接口  {民众:
                     RefinedAbstraction(实现者*);
  空白              手术(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 精炼抽象                               |
//+------------------------------------------------------------------+
空白RefinedAbstraction::RefinedAbstraction(Implementor*i):Abstraction(i)
  {
  打印“创建了精致的抽象,接收了实现者”,我,
        “通过抽象构造函数”);
  }//+------------------------------------------------------------------+
//|参与者 > 精炼抽象                               |
//+------------------------------------------------------------------+
空白精炼抽象::操作(空白)
  {
  打印“精炼抽象操作正在运行”);
  打印“精炼抽象”,&,“正在请求其父级的抽象操作”);
   抽象::操作();//...  }//+------------------------------------------------------------------+
//|参与者                                                     |
//+------------------------------------------------------------------+
//   具体实现者                              
//      实现实现者接口
//      定义其具体实现
//+------------------------------------------------------------------+
//|参与者 > 具体实施者                              |
//+------------------------------------------------------------------+
班级具体实现者A:民众实施者
  {民众:
  空白              操作Imp(空白);
  };空白具体实现者A::OperationImp(空白)
  {
  打印“具体实现者a”,&,“正在运行操作”);
  }//+------------------------------------------------------------------+
//|参与者 > 具体实施者                              |
//+------------------------------------------------------------------+
班级具体实施者B:民众实施者
  {民众:
  空白              操作Imp(空白);
  };空白具体实现者B::OperationImp(空白)
  {
  打印“具体实现者b”,&,“正在运行操作”);
  }//+------------------------------------------------------------------+
//|参与者                                                     |
//+------------------------------------------------------------------+
班级客户:民众客户端示例
  {民众:
  细绳            输出(空白);
  空白              跑步(空白);
  };细绳客户端::输出(空白){返回 __功能__;}//+------------------------------------------------------------------+
//|合作                                                   |
//+------------------------------------------------------------------+
空白客户端::运行(空白//   抽象将客户端请求转发到其实现者对象  {
   抽象*抽象;//---  打印“用具体实现者创建精致的抽象”);
   抽象=新的精炼抽象(新的具体实现者A);
  打印“请求抽象操作”);
   抽象.Operation();
  删除抽象;//---  打印“用具体实现者 b 创建精致的抽象”);
   抽象=新的精炼抽象(新的具体实施者B);
  打印“请求抽象操作”);
   抽象.Operation();
  删除抽象;
  }
}//+------------------------------------------------------------------+
//|输出                                                            |
//+------------------------------------------------------------------+
//  结构::桥::客户端::输出
//   使用具体实现者创建精致的抽象
//   使用实现者 34603008 创建的抽象
//   实现者 34603008 由抽象保存
//   创建精炼抽象,通过抽象构造函数接收实现者 34603008
//   请求抽象操作
//   精炼抽象操作正在运行
//   精炼抽象 33554432 正在请求其父级的抽象操作
//   抽象在自己的操作中请求其实现者 34603008 依次运行其操作
//  具体实现者a 34603008正在运行操作
//   使用具体实现者 b 创建精致的抽象
//   使用实现者 36700160 创建的抽象
//   实现者 36700160 由抽象保存
//   创建精炼抽象,通过抽象构造函数接收实现者 36700160
//   请求抽象操作
//   精炼抽象操作正在运行
//   精炼抽象 35651584 正在请求其父级的抽象操作
//   抽象在自己的操作中请求其实现者 36700160 依次运行其操作
//   具体实现者 b 36700160 正在运行操作
//+------------------------------------------------------------------+
//|后果                                                    |
//+------------------------------------------------------------------+
//   接口和实现解耦
//      可以在运行时配置
//      无编译时依赖/重新编译
//      鼓励分层 > 结构更好的系统
//         系统的高层部分 > 了解抽象和实现者
//   改进的可扩展性 > 抽象和实现是独立的
//   对客户端隐藏实现细节
//+------------------------------------------------------------------+
//|实施                                                   |
//+------------------------------------------------------------------+
//   只有一个实现者
//   创建正确的实现者对象
//      如果抽象知道所有具体实现者
//         在其构造函数中实例化其中之一
//         根据传递给其构造函数的参数在它们之间做出决定
//      默认实现
//         最初选择
//         稍后根据使用情况更改
//      将决策完全委托给另一个对象(工厂)
//   共享实现者 > 句柄/主体惯用语
//   多重继承
//      从抽象中公开
//      具体实现者私下提供
//      将实现永久绑定到其接口
//+------------------------------------------------------------------+
//|相关模式                                                  |
//+------------------------------------------------------------------+
//   抽象工厂 > 创建并配置特定的桥
//   适配器
//      旨在使不相关的类一起工作
//      在设计后应用于系统
//      bridge > 在设计中预先使用
//+------------------------------------------------------------------+



附件下载

📎 pattern.mq5 (0.47 KB)

📎 patternlauncher.mqh (2.68 KB)

📎 patternorganizer.mqh (2.89 KB)

📎 bridge.mqh (18.93 KB)

Source: MQL5 #30801

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