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