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

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

author emer | 783 人阅读 | 0 人评论 |
//+------------------------------------------------------------------+
//|                                                    装饰器.mqh |
//|                                    2019-2020,迪米特里·佩切里察 |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//|装饰器 < 结构设计模式                            |
//+------------------------------------------------------------------+
//   设计模式:可重用的面向对象软件的元素
//   gof > 埃里希·伽马、理查德·赫尔姆、拉尔夫·约翰逊、约翰·弗利赛德斯
//   发表于 1994 年
//+------------------------------------------------------------------+
//|意图                                                           |
//+------------------------------------------------------------------+
//   动态附加(附加职责)到对象
//   提供——子类化的灵活替代方案——用于扩展
//    功能
//+------------------------------------------------------------------+
//|好处                                                         |
//+------------------------------------------------------------------+
//   变量方面 > 没有子类化的对象的职责
//   代码重构
//      无法方便地更改类 > 还 > 适配器、访问者
//      通过子类化扩展功能
//         解决方案 > 组合行为的组合/委托
//         还 > 桥梁、责任链、复合、
//          观察者、策略
//+------------------------------------------------------------------+
//|适用性                                                   |
//+------------------------------------------------------------------+
//   添加职责 — 到各个对象 —
//      动态且透明地——不影响其他对象
//   对于可以撤销的责任
//   当通过子类化扩展不切实际时
//      有时可能存在大量独立扩展
//       并会产生大量子类来支持
//       每种组合
//      或者类定义可能被隐藏
//      否则无法进行子类化
//+------------------------------------------------------------------+
//|结构                                                        |
//+------------------------------------------------------------------+
//
//                  |组件 |<------------------------------------------+
//                  |-----------|                               |
//                  |操作()|                               |
//                        ^                                     |
//                        |                                     |
//            +-----------+------------+                       |
//            |                         |             组件|
//   |ConcreteComponent|    |       装饰器       |------------+
//   |-----------------|    |------------------------|
//   |操作()      |    |操作()            |
//                         ||  组件.Operation()|
//                                      ^
//                                     |
//                        +------------++------------+
//                        |                        |
//               |ConcreteDecoratorA|  |   具体装饰器B |
//               |--------------------------------|  |------------------------|
//               |操作()       |  |操作()            |
//               |--------------------------------|  |装饰器::操作()|
//               |added_state       |  |添加行为()       |
//                                     |AddedBehavior()        |
//
#包括名称空间装饰者
{//+------------------------------------------------------------------+
//|参与者 > 组件                                        |
//+------------------------------------------------------------------+
班级成分//   定义 — 对象的接口
//      可以动态添加职责  {民众:
  虚拟的 空白      手术(空白)=0;
  };//+------------------------------------------------------------------+
//|参与者 > 装饰者                                        |
//+------------------------------------------------------------------+
班级装饰者:民众成分//   维护 — 对组件对象的引用
//   定义 — 接口 — 符合组件的接口  {民众:
   组件*        组件;
  空白              手术(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 装饰者                                        |
//+------------------------------------------------------------------+
空白装饰器::操作(空白)
  {
  如果检查指针(组件)>0)
     {
      组件.Operation();
     }
  }//+------------------------------------------------------------------+
//|参与者 > 具体组件                                |
//+------------------------------------------------------------------+
班级具体组件:民众成分//   定义了可以附加额外职责的对象  {民众:
  空白              手术(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 具体组件                                |
//+------------------------------------------------------------------+
空白具体组件::操作(空白)
  {
  打印《具体操作》);
  }//+------------------------------------------------------------------+
//|参与者 > 混凝土装饰者                                |
//+------------------------------------------------------------------+
//   向组件添加职责
//+------------------------------------------------------------------+
//|参与者 > 具体装饰者 > a                            |
//+------------------------------------------------------------------+
班级具体装饰器A:民众装饰者
  {受保护的:
  细绳            添加状态;民众:
                     具体装饰器A(空白);
  空白              手术(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 具体装饰者 > a                            |
//+------------------------------------------------------------------+ConcreteDecoratorA::ConcreteDecoratorA(空白):
   添加状态(“添加状态”)
  {
  }//+------------------------------------------------------------------+
//|参与者 > 具体装饰者 > a                            |
//+------------------------------------------------------------------+
空白ConcreteDecoratorA::操作(空白)
  {
   装饰器::操作();
  打印(添加状态);
  }//+------------------------------------------------------------------+
//|参与者 > 混凝土装饰者 > b                            |
//+------------------------------------------------------------------+
班级具体装饰器B:民众装饰者
  {民众:
  空白              添加的行为(空白);
  空白              手术(空白);
  };//+------------------------------------------------------------------+
//|参与者 > 混凝土装饰者 > b                            |
//+------------------------------------------------------------------+
空白ConcreteDecoratorB::AddedBehavior(空白)
  {
  打印“添加行为”);
  }//+------------------------------------------------------------------+
//|参与者 > 混凝土装饰者 > b                            |
//+------------------------------------------------------------------+
空白ConcreteDecoratorB::操作(空白)
  {
   装饰器::操作();
   添加行为();
  }//+------------------------------------------------------------------+
//|参与者 > 客户                                           |
//+------------------------------------------------------------------+
班级客户:民众客户端示例
  {民众:
  细绳            输出(空白);
  空白              跑步(空白);
  };细绳客户端::输出(空白){返回 __功能__;}//+------------------------------------------------------------------+
//|合作                                                   |
//+------------------------------------------------------------------+
空白客户端::运行(空白//   装饰器
//      转发——请求——到它的组件对象
//      它可以选择执行 - 之前和之前的附加操作
//       转发请求后  {
   成分*成分=新的具体组件();
   装饰器*装饰器_a=新的具体装饰器A();
   装饰器*装饰器_b=新的具体装饰器B();
   装饰器_a.component=组件;
   装饰器_b.组件=装饰器_a;
   装饰器_b.Operation();//---  删除成分;
  删除装饰器_a;
  删除装饰器_b;
  }
}//+------------------------------------------------------------------+
//|输出                                                            |
//+------------------------------------------------------------------+
//   装饰器::客户端::输出
//   具体操作
//   添加状态
//   添加的行为
//+------------------------------------------------------------------+
//|后果                                                    |
//+------------------------------------------------------------------+
//  比静态继承更灵活
//      可以在运行时添加和删除职责
//       只需附加和分离它们
//      轻松添加属性两次
//   避免层次结构中高层的功能丰富的类
//      逐步添加功能
//         独立定义新装饰器
//            来自它们扩展的对象类
//            即使是不可预见的扩展
//   装饰器及其组件不相同
//   很多小物体
//+------------------------------------------------------------------+
//|实施                                                   |
//+------------------------------------------------------------------+
//   接口一致性 > 装饰器组件
//   省略抽象装饰器类 - 如果是单一责任
//  保持组件轻量化
//  改变对象的外观与改变其内部 > 策略
//+------------------------------------------------------------------+
//|相关模式                                                  |
//+------------------------------------------------------------------+
//   适配器 > 将为对象提供一个全新的接口
//      装饰器 > 更改对象的职责,而不是其接口
//   合成的
//      装饰器 — 是一种只有一个组件的简并复合体 —
//       不适用于对象聚合
//   策略 > 改变对象的内部结构
//      装饰器 > 更改对象的外观
//+------------------------------------------------------------------+



附件下载

📎 pattern.mq5 (2.21 KB)

📎 patternorganizer.mqh (13.31 KB)

📎 decorator.mqh (22.3 KB)

Source: MQL5 #30969

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