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

观察者(推送) - 行为设计模式 - MetaTrader 5 库

author emer | 192 人阅读 | 0 人评论 |
//+------------------------------------------------------------------+
//|                                                201111_091814.mq5 |
//|                                    2019-2020,迪米特里·佩切里察 |
//|                                                 792112@gmail.com |
//+------------------------------------------------------------------+
//
//   观察者(推送)- 行为设计模式
//
//   来自:设计模式:可重用的面向对象软件的元素
//   作者:erich gamma、richard helm、ralph johnson、john vlissides
//   发表于 1994 年
//
//   意图
//
//   定义对象之间的一对多依赖关系,以便当一个对象
//更改状态,其所有依赖项都会收到通知并自动更新
//
//   适用性
//
//  当抽象有两个方面,一个方面依赖于另一个方面时。
//将这些方面封装在单独的对象中可以让您改变和重用
//他们独立
//  当对一个对象的更改需要更改其他对象,而您不需要时
//知道有多少对象需要改变
//   当一个对象应该能够通知其他对象而不需要
//关于这些对象是谁的假设。换句话说,你不想要
//这些对象紧密耦合
//
//   结构
//
//                            观察者
//   |       主题        |------------------------>*|观察者|
//   |----------------------|                        |--------|
//   |附加(观察者)      |                        |更新()|
//   |分离(观察者)      |                            ^
//   |Notify()              |                            |
//   |观察员中的所有o|                            |
//   |  o.Update()          |                            |
//              ^                                       |
//              |                              |  具体观察者 |
//              |                      主题|--------------------|
//   |    具体主题    |<----------------|更新()            |
//   |------------------------|                 |观察者状态=     |
//   |GetState()             |                 |  主题.GetState()|
//   |返回 subject.State()|                 |--------------------|
//   |SetState()             |                 |observer_state      |
//   |------------------------|
//   |subject_state          |
//
//   参与者
//
//   主题
//      了解其观察者。任意数量的观察者对象可以观察
//一个主题
//      提供用于附加和分离观察者对象的接口
//   观察者
//      定义应通知的对象的更新接口
//主题的变化
//   具体主题
//      存储具体观察者对象感兴趣的状态
//      当状态改变时向观察者发送通知
//   具体观察者
//      维护对具体主题对象的引用
//      存储应与主题保持一致的状态
//      实现观察者更新接口以保持其状态一致
//与主题的
//
//   合作
//
//   每当发生变化时,具体主体都会通知其观察者
//这可能会使其观察者的状态与其自身的状态不一致。
//   在得知具体主题发生变化后,具体
//观察者对象可以向主体查询信息。具体观察者
//使用此信息来协调其状态与主体的状态。
//
//   aConcrete              aConcrete          另一个
//    主题                观察者      ConcreteObserver
//       |                      |                 |
//       |           设置状态()|                 |
//      | |<--------------------| |                |
//      | |通知()            | |                |
//      | |------------+         |                 |
//      | |           |         |                 |
//      | |<----------+         |                 |
//      | |更新()             |                 |
//      | |------------------->| |                |
//      | |          获取状态()| |                |
//      | |<--------------------| |                |
//      | |更新()             |                 |
//      | |--------------------|-------------->| |
//      | |                     |      获取状态()| |
//      | |<--------------------------------|----------------| |
//       |                      |                 |
//
//   注意发起变更请求的观察者对象如何推迟
//它的更新直到它收到来自主题的通知。通知是
//并不总是由主题调用。它可以由观察者调用或
//完全由另一种对象实现。
//
#包括201111_084634.mqh>//推送观察者
#包括201111_084512.mqh>//推送主题
#包括201111_091110.mqh>//推具体主题
#包括201111_090802.mqh>//推送具体观察者

//+------------------------------------------------------------------+
//|客户端                                                           |
//+------------------------------------------------------------------+
空白 启动时空白)
  {
   具体主题;
   主题.附件(新的具体观察者(主题));
   主题.附件(新的具体观察者(主题));
   主题.状态(“新推送状态”);
   主题.Notify();
  }//
//   输出
//
//   主题状态设置为:新推送状态
//   将状态推送给观察者 2097152...
//   观察者 2097152 状态更新为:新推送状态
//   将状态推送给观察者 3145728...
//   观察者 3145728 状态更新为:新推送状态
//
//   结果
//
//   观察者模式可让您独立地改变主题和观察者。
//你可以重用主题而不重用它们的观察者,反之亦然。
//它允许您添加观察者而不修改主题或其他观察者。
//   观察者模式的进一步优点和缺点包括
//下列:
//      主体和观察者之间的抽象耦合
//      支持广播通信
//      意外更新
//
//   执行
//
//   将主题映射到观察者
//   观察多个对象
//   谁触发更新?
//   对已删除主题的悬空引用
//   在通知之前确保主题状态是自洽的
//   避免特定于观察者的更新协议:推模型和拉模型
//   明确指定感兴趣的修改
//   封装复杂的更新语义
//   组合主体类和观察者类
//
//   相关模式
//
//   中介者
//   单例
//+------------------------------------------------------------------+



附件下载

📎 201111_091814.mq5 (6.6 KB)

📎 201111_084634.mqh (0.7 KB)

📎 201111_084512.mqh (3.91 KB)

📎 201111_091110.mqh (0.73 KB)

📎 201111_090802.mqh (1.61 KB)

Source: MQL5 #31796

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