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

编程模式 - 复合 - MetaTrader 5 库

author emer | 979 人阅读 | 0 人评论 |

Programming patterns - Composite - library for MetaTrader 5

Programming patterns - Composite - library for MetaTrader 5

/********************************************************************
编程模式:复合模式
将对象组合成树结构以表示部分-整体层次结构。
复合允许客户统一处理单个对象和对象组合。
/**/


Programming patterns - Composite - library for MetaTrader 5

/********************************************************************/
班级成分//抽象(接口)  {民众:
  虚拟的 空白         运算()=0;
  虚拟的 空白         添加(组件*)=0;
  虚拟的 空白         删除(组件*)=0;
  虚拟的组件*   GetChild(整数)=0;
                     组件() {}
                     组件(细绳名称):mname(名称)  {}受保护的:
  细绳            名称;
  };/********************************************************************/
班级叶子:民众成分
  {民众:
  空白              手术() {打印(名字);}
  空白              添加(组件*){}
  空白              删除(组件*){}
   组件*        GetChild(整数){返回 无效的;}
                     叶子(细绳名称):组件(名称){}
  };/********************************************************************/
班级合成的:民众成分
  {民众:
   ObjectList节点;
  空白              手术() {打印(名字);整数c=nodes.Count();为了整数我=0;我空白              Add(Component*c) {nodes+=c;}
  空白              删除(组件*c) {节点-=c;}
   组件*        GetChild(整数我) {返回节点[i];}
                     复合材料(细绳名称):组件(名称){}
  };/**/


/********************************************************************
适用性
   使用复合模式时
      你想要表示对象的部分-整体层次结构。
      您希望客户能够忽略成分之间的差异
       对象和单个对象。客户端将处理组合中的所有对象
       结构均匀。
参加者
   组件
      声明组合中对象的接口。
      实现所有类共有的接口的默认行为,如
       适当的。
      声明一个用于访问和管理其子组件的接口。
      (可选)定义一个用于访问组件父级的接口
       递归结构,并在适当的情况下实现它。
   叶
      代表组合中的叶子对象。一片叶子没有孩子。
      定义组合中原始对象的行为。
   复合材料 
      定义有子组件的行为。
      存储子组件。
      在 Component 接口中实现与子级相关的操作。
   客户
       通过 Component 接口操作组合中的对象。
合作
   客户端使用 Component 类接口与对象中的对象进行交互
    复合结构。如果接收者是叶子,则处理请求
    直接。如果接收者是复合体,那么它通常会将请求转发到其
    子组件,可能在之前和/或之后执行附加操作
    转发。
后果
   复合模式
      定义由原始对象和复合对象组成的类层次结构。
       原始对象可以组合成更复杂的对象,而更复杂的对象又可以
       被组合,递归地依此类推。只要客户端代码需要原语
       对象,它也可以采用复合对象。
      让客户端变得简单。客户可以处理复合结构和个体
       物体均匀。客户通常不知道(也不应该关心)是否
       他们正在处理一片叶子或一个复合组件。这简化了客户端
       代码,因为它避免了编写标记和案例语句样式的函数
       超过定义组合的类。
      使得添加新类型的组件变得更加容易。新定义的复合或
       叶子类自动与现有结构和客户端代码一起工作。
       不必为新的组件类更改客户端。
      会让你的设计过于笼统。缺点是容易添加
       新组件的优点是它使得限制组件的难度变得更加困难
       复合。有时您希望复合材料仅包含某些组件。       使用 Composite,您不能依赖类型系统来强制执行这些约束
       为了你。您必须改用运行时检查。
/**/


/********************************************************************
复合模式使用示例。客户
/****************************************************************/
空白 启动时()
  {
  /*根*/   分量*根=新的合成的(“根”);//动态 // = 复合根("ROOT"); //汽车  /*部分*/   组件*分支1=新的合成的(“  分支 1”);
   组件*分支2=新的合成的(“  分支 2”);
   组件*叶1=新的叶子(“    叶子 1”);
   组件*叶2=新的叶子(“    叶子 2”);
  /*构建树*/   根.添加(无效的);                        //误...   根.添加(branch1);
   根.添加(branch2);
   分支1.Add(叶1);
   分支1.添加(叶2);
   分支2.添加(叶2);
   分支2.添加(新的叶子(“    叶子 3”));  //通过引用添加部分(非var)   root.Operation();                      //查看     {细绳s;为了整数我=0;我<13; i++) {s+=“-”;}打印(s);}
  /*删除整个分支*/   根.删除(branch1);
   root.Operation();                      //查看  /*删除根目录*/  删除根;
  }/********************************************************************
输出:
/**
   根
     分行1
       叶 1
       叶2
     分行2
       叶2
       叶 3
   -------------
   根
     分行2
       叶2
       叶 3
/**/



附件下载

📎 composite.mq5 (2.67 KB)

📎 composite.mqh (4.44 KB)

📎 objectlist.mqh (6.64 KB)

Source: MQL5 #29767

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