Bridge - 结构设计模式 - MetaTrader 5 库
//+------------------------------------------------------------------+ //| 桥.mqh | //| 2019-2020,德米特里·佩切里察 | //| 792112@gmail.com | //+------------------------------------------------------------------+ //|桥梁 > 结构设计模式 | //+------------------------------------------------------------------+ // 设计模式:可重用的面向对象软件的元素 // gof > 埃里希·伽马、理查德·赫尔姆、拉尔夫·约翰逊、约翰·弗利赛德斯 // 发表于 1994 年 //+------------------------------------------------------------------+ //|意图 | //+------------------------------------------------------------------+ // 抽象和实现 > 解耦,独立变化 //+------------------------------------------------------------------+ //|好处 | //+------------------------------------------------------------------+ // 变量方面 > 对象的实现 // 重构问题 // 对硬件和软件平台的依赖 // 对对象表示/实现的依赖 // 紧耦合 // 通过子类化扩展功能 // 重构解决方案 // 限制平台依赖性 // 还 > 抽象工厂、桥 // 隐藏客户端的依赖以防止级联更改 // 还 > 抽象工厂、桥、备忘录、代理 // 通过抽象耦合和分层进行解耦 // 还 // 抽象工厂、桥梁、责任链、 // 命令、外观、中介、观察者 // 组合/委托 // 组合行为比继承更灵活 // 还 // 桥梁、责任链、复合、装饰器、 // 观察者、策略 //+------------------------------------------------------------------+ //|适用性 | //+------------------------------------------------------------------+ // 抽象/实现 // 未绑定 > 在运行时切换实现 // 可通过子类化>独立组合/扩展来扩展 // 抽象的实现 // 更改对客户端没有影响(无需重新编译) // 可以在 C++ 中对客户端隐藏 // 类的增殖 > 将对象分成两部分 // 实现可以在多个对象之间共享(引用计数) //+------------------------------------------------------------------+ //|结构 | //+------------------------------------------------------------------+ // //|客户端| // | // +-->| 抽象 |----------------->|实施者 | // |----------------| |--------------| // |操作() | |操作Imp()| // | imp.Operation()| ^ // ^ | // | +----------+----------+ // | | | // |精致抽象| |具体实现者A| |具体实施者B| // |--------------------| |--------------------| // |OperationImp() | |OperationImp() | // #包括名称空间桥 {//+------------------------------------------------------------------+ //|参与者 | //+------------------------------------------------------------------+ 界面实施者// 定义实现类的接口 // 实现者接口仅提供原始操作 // 抽象基于这些原语定义了更高级别的操作 { 空白操作Imp(空白); };//+------------------------------------------------------------------+ //|参与者 | //+------------------------------------------------------------------+ 班级抽象// 定义抽象的接口 // 维护对实现者类型的对象的引用 {民众: 虚拟的 空白 手术(空白); 抽象(实现者*); 抽象(空白); 〜抽象(空白);受保护的: 实施者* 实施者; };空白抽象::抽象(空白){}//+------------------------------------------------------------------+ //|参与者 > 抽象 | //+------------------------------------------------------------------+ 空白抽象::抽象(实现者*i):实现者(i) { 打印(“由实现者创建的抽象”,我); 打印(“实施者”,我,“通过抽象来保存”); }//+------------------------------------------------------------------+ //|参与者 > 抽象 | //+------------------------------------------------------------------+ 空白抽象::~抽象(空白) { 删除实施者; }//+------------------------------------------------------------------+ //|参与者 > 抽象 | //+------------------------------------------------------------------+ 空白抽象::操作(空白) { 打印(“抽象是在自己的操作中要求其实现者”, 实施者,“依次运行其操作”); 实现者.OperationImp(); }//+------------------------------------------------------------------+ //|参与者 | //+------------------------------------------------------------------+ 班级精炼抽象:民众抽象// 扩展抽象定义的接口 {民众: RefinedAbstraction(实现者*); 空白 手术(空白); };//+------------------------------------------------------------------+ //|参与者 > 精炼抽象 | //+------------------------------------------------------------------+ 空白RefinedAbstraction::RefinedAbstraction(Implementor*i):Abstraction(i) { 打印(“创建了精致的抽象,接收了实现者”,我, “通过抽象构造函数”); }//+------------------------------------------------------------------+ //|参与者 > 精炼抽象 | //+------------------------------------------------------------------+ 空白精炼抽象::操作(空白) { 打印(“精炼抽象操作正在运行”); 打印(“精炼抽象”,&这,“正在请求其父级的抽象操作”); 抽象::操作();//... }//+------------------------------------------------------------------+ //|参与者 | //+------------------------------------------------------------------+ // 具体实现者 // 实现实现者接口 // 定义其具体实现 //+------------------------------------------------------------------+ //|参与者 > 具体实施者 | //+------------------------------------------------------------------+ 班级具体实现者A:民众实施者 {民众: 空白 操作Imp(空白); };空白具体实现者A::OperationImp(空白) { 打印(“具体实现者a”,&这,“正在运行操作”); }//+------------------------------------------------------------------+ //|参与者 > 具体实施者 | //+------------------------------------------------------------------+ 班级具体实施者B:民众实施者 {民众: 空白 操作Imp(空白); };空白具体实现者B::OperationImp(空白) { 打印(“具体实现者b”,&这,“正在运行操作”); }//+------------------------------------------------------------------+ //|参与者 | //+------------------------------------------------------------------+ 班级客户:民众客户端示例 {民众: 细绳 输出(空白); 空白 跑步(空白); };细绳客户端::输出(空白){返回 __功能__;}//+------------------------------------------------------------------+ //|合作 | //+------------------------------------------------------------------+ 空白客户端::运行(空白)// 抽象将客户端请求转发到其实现者对象 { 抽象*抽象;//--- 打印(“用具体实现者创建精致的抽象”); 抽象=新的精炼抽象(新的具体实现者A); 打印(“请求抽象操作”); 抽象.Operation(); 删除抽象;//--- 打印(“用具体实现者 b 创建精致的抽象”); 抽象=新的精炼抽象(新的具体实施者B); 打印(“请求抽象操作”); 抽象.Operation(); 删除抽象; } }//+------------------------------------------------------------------+ //|输出 | //+------------------------------------------------------------------+ // 结构::桥::客户端::输出 // 使用具体实现者创建精致的抽象 // 使用实现者 34603008 创建的抽象 // 实现者 34603008 由抽象保存 // 创建精炼抽象,通过抽象构造函数接收实现者 34603008 // 请求抽象操作 // 精炼抽象操作正在运行 // 精炼抽象 33554432 正在请求其父级的抽象操作 // 抽象在自己的操作中请求其实现者 34603008 依次运行其操作 // 具体实现者a 34603008正在运行操作 // 使用具体实现者 b 创建精致的抽象 // 使用实现者 36700160 创建的抽象 // 实现者 36700160 由抽象保存 // 创建精炼抽象,通过抽象构造函数接收实现者 36700160 // 请求抽象操作 // 精炼抽象操作正在运行 // 精炼抽象 35651584 正在请求其父级的抽象操作 // 抽象在自己的操作中请求其实现者 36700160 依次运行其操作 // 具体实现者 b 36700160 正在运行操作 //+------------------------------------------------------------------+ //|后果 | //+------------------------------------------------------------------+ // 接口和实现解耦 // 可以在运行时配置 // 无编译时依赖/重新编译 // 鼓励分层 > 结构更好的系统 // 系统的高层部分 > 了解抽象和实现者 // 改进的可扩展性 > 抽象和实现是独立的 // 对客户端隐藏实现细节 //+------------------------------------------------------------------+ //|实施 | //+------------------------------------------------------------------+ // 只有一个实现者 // 创建正确的实现者对象 // 如果抽象知道所有具体实现者 // 在其构造函数中实例化其中之一 // 根据传递给其构造函数的参数在它们之间做出决定 // 默认实现 // 最初选择 // 稍后根据使用情况更改 // 将决策完全委托给另一个对象(工厂) // 共享实现者 > 句柄/主体惯用语 // 多重继承 // 从抽象中公开 // 具体实现者私下提供 // 将实现永久绑定到其接口 //+------------------------------------------------------------------+ //|相关模式 | //+------------------------------------------------------------------+ // 抽象工厂 > 创建并配置特定的桥 // 适配器 // 旨在使不相关的类一起工作 // 在设计后应用于系统 // bridge > 在设计中预先使用 //+------------------------------------------------------------------+
附件下载
📎 pattern.mq5 (0.47 KB)
📎 patternlauncher.mqh (2.68 KB)
📎 patternorganizer.mqh (2.89 KB)
📎 bridge.mqh (18.93 KB)
Source: MQL5 #30801
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
