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

访客 - 行为设计模式 - MetaTrader 5 库

author emer | 468 人阅读 | 0 人评论 |
//+------------------------------------------------------------------+
//|                                                      访客.mq5 |
//|                                    2019-2020,迪米特里·佩切里察 |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//
//  访客 - 行为设计模式
//
//   来自:设计模式:可重用的面向对象软件的元素
//   作者:erich gamma、richard helm、ralph johnson、john vlissides
//   发表于 1994 年
//
//   意图
//  
//   表示对对象的元素执行的操作
//结构。访问者让您无需更改即可定义新操作
//它所操作的元素的类。
//
//   适用性
//
//   在以下情况下使用访问者模式
//      一个对象结构包含许多具有不同类型的对象
//接口,并且您想要对这些对象执行操作
//取决于他们的具体类。
//      需要执行许多不同且不相关的操作
//对象结构中的对象,并且您希望避免“污染”它们
//具有这些操作的类。访客让您保留相关操作
//通过将它们定义在一个类中来将它们结合在一起。当对象结构为
//由许多应用程序共享,使用访问者将操作放入这些应用程序中
//需要它们的应用程序。
//      定义对象结构的类很少改变,但是你
//经常想在结构上定义新的操作。改变
//对象结构类需要重新定义所有访问者的接口,
//这可能是昂贵的。如果对象结构类发生变化
//通常,那么最好在这些类中定义操作。
//
//   结构
//
//|客户端|---------->|                访客                |
//   |               |----------------------------------------|
//   |               |访问ConcreteElementA(ConcreteElementA)|
//   |               |访问ConcreteElementB(ConcreteElementB)|
//   |                                  ^
//   |                                  |
//   |                  +----------------+----------------+
//   |                  |                               |
//   |       |   具体访客1    |     |    具体访客2 |
//   |       |---------------------- |     |------------------------|
//   |       |VisitConcreteElementA( |     |VisitConcreteElementA( |
//   |       |具体元素A)     |     |具体元素A)     |
//   |       |VisitConcreteElementB( |     |VisitConcreteElementB( |
//   |       |具体元素B)     |     |具体元素B)     |
//   |
//   |
//   +--->|ObjectStructure|--->*|    元素    |
//                              |---------------|
//                              |接受(访客)|
//                                      ^
//                                     |
//                   +--------------------------------+-----------------+
//                   |                                     |
//    |       具体元素A       |     |       具体元素B       |
//    |------------------------------------------|     |------------------------------|
//    |接受(访客)               |     |接受(访客)               |
//    | v.VisitConcreteElementA(this)|     | v.VisitConcreteElementB(this)|
//    |操作A()                  |     |操作B()                  |
//
//
//   参与者
//
//  访客
//      为每个具体元素类声明一个访问操作
//在对象结构中。操作的名称和签名标识
//向访问者发送访问请求的类。这让
//visitor 确定被访问元素的具体类。然后
//访问者可以通过其特定的接口直接访问该元素。
//   具体访问者
//      实现访问者声明的每个操作。每次操作
//实现为相应定义的算法片段
//结构中对象的类。具体访问者提供上下文
//用于算法并存储其本地状态。这种状态经常积累
//遍历结构期间的结果。
//   元素
//      定义一个接受操作,该操作将访问者作为参数。
//   具体元素
//      实现接受访问者作为参数的操作。
//  对象结构
//      可以枚举其元素。
//      可以提供高级接口以允许访问者访问
//它的元素。
//      可以是复合体,也可以是集合,例如列表或集合。
//
//   合作
//
//   使用访问者模式的客户端必须创建一个具体的访问者
//object然后遍历对象结构,访问每个元素
//与访客。
//  当某个元素被访问时,会调用对应的访问者操作
//到它的类。该元素将自身作为此操作的参数
// 如有必要,让访问者访问其状态。
//  以下交互图说明了协作
//在对象结构、访问者和两个元素之间:
//  
//   anObject        aConcreteElementA   aConcreteElementB      aConcreteVisitor
//   结构              |                   |                      |
//      |                   |                   |                      |
//     | |接受(访客)  |                   |                      |
//     | |---------------->| |访问ConcreteElementA(aConcreteElementA) |
//     | |                 | |------------------|-------------------->| |
//     | |                  |                   |                     | |
//     | |                 | |<-----------------|---------------------| |
//     | |接受(访客)  |                   |                      |
//     | |------------------|----------------->| |访问混凝土        |
//     | |                  |                  | | ElementB(a具体 | |
//     | |                  |                  | |元素B)          | |
//     | |                  |                  | |------------------->| |
//     | |                  |                   |                     | |
//     | |                  |                  | |<--------------------| |
//      |                   |                   |                      |
//
//+------------------------------------------------------------------+
//|                                              客户示例 |
//+------------------------------------------------------------------+
#包括#包括#包括#包括#包括#包括#包括空白 启动时()
  {
   ObjectStructure结构;
   结构体.添加(新的具体元素A());
   结构体.添加(新的具体元素B());
   结构.接受(新的具体访问者1());
   结构.接受(新的具体访问者2());
  }//   输出
//
//   将元素 2097152 添加到对象结构中
//   将元素 3145728 添加到对象结构中
//  
//   对象结构已接受新访问者 4194304
//   对象结构有 2 个元素
//  对象结构正在请求每个元素接受访问者
//   元素 a 已接受访问者
//   元素执行操作 a
//   元素 b 已接受访问者
//   元素执行操作 b
//
//   对象结构已接受新访问者 5242880
//   对象结构有 2 个元素
//  对象结构正在请求每个元素接受访问者
//   元素 a 已接受访问者
//   元素执行操作 a
//   元素 b 已接受访问者
//   元素执行操作 b
//  
//
//   结果
//
//   访问者模式的一些优点和缺点如下
//如下:
//      访问者使添加新操作变得容易
//      访问者收集相关操作并分离不相关的操作
//      添加新的具体元素类很困难
//      跨类层次结构访问
//      累积状态
//      打破封装
//
//   执行
//
//   每个对象结构都有一个关联的访问者类。这
//抽象visitor类声明了一个访问具体元素的操作
//定义对象结构的具体元素的每个类。每次访问
//对访问者的操作将其参数声明为特定的具体参数
//元素,允许访问者访问具体的界面
//直接元素。具体访问者类覆盖每个访问操作
//为相应的具体实现特定于访问者的行为
//元素类。
//   这是您申请时出现的另外两个实施问题
//访问者模式:
//      双重调度
//      谁负责遍历对象结构?
//
//   相关模式
//
//   复合:访问者可用于对对象应用操作
//由复合模式定义的结构。
//   口译员:访客可以申请进行口译。
//
//+------------------------------------------------------------------+



附件下载

📎 visitor.mq5 (9.23 KB)

📎 element.mqh (1.32 KB)

📎 concreteelementa.mqh (1.29 KB)

📎 concreteelementb.mqh (1.3 KB)

📎 visitor.mqh (0.6 KB)

📎 concretevisitor1.mqh (1.26 KB)

📎 concretevisitor2.mqh (1.25 KB)

📎 objectstructure.mqh (2.64 KB)

Source: MQL5 #32433

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