观察者(推送) - 行为设计模式 - MetaTrader 5 库
//+------------------------------------------------------------------+ //| 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小时后评论,即可解锁附件下载
立即登录
