Decorator - 结构设计模式 - MetaTrader 5 库
//+------------------------------------------------------------------+ //| 装饰器.mqh | //| 2019-2020,迪米特里·佩切里察 | //| 792112@gmail.com | //+------------------------------------------------------------------+ //|装饰器 < 结构设计模式 | //+------------------------------------------------------------------+ // 设计模式:可重用的面向对象软件的元素 // gof > 埃里希·伽马、理查德·赫尔姆、拉尔夫·约翰逊、约翰·弗利赛德斯 // 发表于 1994 年 //+------------------------------------------------------------------+ //|意图 | //+------------------------------------------------------------------+ // 动态附加(附加职责)到对象 // 提供——子类化的灵活替代方案——用于扩展 // 功能 //+------------------------------------------------------------------+ //|好处 | //+------------------------------------------------------------------+ // 变量方面 > 没有子类化的对象的职责 // 代码重构 // 无法方便地更改类 > 还 > 适配器、访问者 // 通过子类化扩展功能 // 解决方案 > 组合行为的组合/委托 // 还 > 桥梁、责任链、复合、 // 观察者、策略 //+------------------------------------------------------------------+ //|适用性 | //+------------------------------------------------------------------+ // 添加职责 — 到各个对象 — // 动态且透明地——不影响其他对象 // 对于可以撤销的责任 // 当通过子类化扩展不切实际时 // 有时可能存在大量独立扩展 // 并会产生大量子类来支持 // 每种组合 // 或者类定义可能被隐藏 // 否则无法进行子类化 //+------------------------------------------------------------------+ //|结构 | //+------------------------------------------------------------------+ // // |组件 |<------------------------------------------+ // |-----------| | // |操作()| | // ^ | // | | // +-----------+------------+ | // | | 组件| // |ConcreteComponent| | 装饰器 |------------+ // |-----------------| |------------------------| // |操作() | |操作() | // || 组件.Operation()| // ^ // | // +------------++------------+ // | | // |ConcreteDecoratorA| | 具体装饰器B | // |--------------------------------| |------------------------| // |操作() | |操作() | // |--------------------------------| |装饰器::操作()| // |added_state | |添加行为() | // |AddedBehavior() | // #包括名称空间装饰者 {//+------------------------------------------------------------------+ //|参与者 > 组件 | //+------------------------------------------------------------------+ 班级成分// 定义 — 对象的接口 // 可以动态添加职责 {民众: 虚拟的 空白 手术(空白)=0; };//+------------------------------------------------------------------+ //|参与者 > 装饰者 | //+------------------------------------------------------------------+ 班级装饰者:民众成分// 维护 — 对组件对象的引用 // 定义 — 接口 — 符合组件的接口 {民众: 组件* 组件; 空白 手术(空白); };//+------------------------------------------------------------------+ //|参与者 > 装饰者 | //+------------------------------------------------------------------+ 空白装饰器::操作(空白) { 如果(检查指针(组件)>0) { 组件.Operation(); } }//+------------------------------------------------------------------+ //|参与者 > 具体组件 | //+------------------------------------------------------------------+ 班级具体组件:民众成分// 定义了可以附加额外职责的对象 {民众: 空白 手术(空白); };//+------------------------------------------------------------------+ //|参与者 > 具体组件 | //+------------------------------------------------------------------+ 空白具体组件::操作(空白) { 打印(《具体操作》); }//+------------------------------------------------------------------+ //|参与者 > 混凝土装饰者 | //+------------------------------------------------------------------+ // 向组件添加职责 //+------------------------------------------------------------------+ //|参与者 > 具体装饰者 > a | //+------------------------------------------------------------------+ 班级具体装饰器A:民众装饰者 {受保护的: 细绳 添加状态;民众: 具体装饰器A(空白); 空白 手术(空白); };//+------------------------------------------------------------------+ //|参与者 > 具体装饰者 > a | //+------------------------------------------------------------------+ConcreteDecoratorA::ConcreteDecoratorA(空白): 添加状态(“添加状态”) { }//+------------------------------------------------------------------+ //|参与者 > 具体装饰者 > a | //+------------------------------------------------------------------+ 空白ConcreteDecoratorA::操作(空白) { 装饰器::操作(); 打印(添加状态); }//+------------------------------------------------------------------+ //|参与者 > 混凝土装饰者 > b | //+------------------------------------------------------------------+ 班级具体装饰器B:民众装饰者 {民众: 空白 添加的行为(空白); 空白 手术(空白); };//+------------------------------------------------------------------+ //|参与者 > 混凝土装饰者 > b | //+------------------------------------------------------------------+ 空白ConcreteDecoratorB::AddedBehavior(空白) { 打印(“添加行为”); }//+------------------------------------------------------------------+ //|参与者 > 混凝土装饰者 > b | //+------------------------------------------------------------------+ 空白ConcreteDecoratorB::操作(空白) { 装饰器::操作(); 添加行为(); }//+------------------------------------------------------------------+ //|参与者 > 客户 | //+------------------------------------------------------------------+ 班级客户:民众客户端示例 {民众: 细绳 输出(空白); 空白 跑步(空白); };细绳客户端::输出(空白){返回 __功能__;}//+------------------------------------------------------------------+ //|合作 | //+------------------------------------------------------------------+ 空白客户端::运行(空白)// 装饰器 // 转发——请求——到它的组件对象 // 它可以选择执行 - 之前和之前的附加操作 // 转发请求后 { 成分*成分=新的具体组件(); 装饰器*装饰器_a=新的具体装饰器A(); 装饰器*装饰器_b=新的具体装饰器B(); 装饰器_a.component=组件; 装饰器_b.组件=装饰器_a; 装饰器_b.Operation();//--- 删除成分; 删除装饰器_a; 删除装饰器_b; } }//+------------------------------------------------------------------+ //|输出 | //+------------------------------------------------------------------+ // 装饰器::客户端::输出 // 具体操作 // 添加状态 // 添加的行为 //+------------------------------------------------------------------+ //|后果 | //+------------------------------------------------------------------+ // 比静态继承更灵活 // 可以在运行时添加和删除职责 // 只需附加和分离它们 // 轻松添加属性两次 // 避免层次结构中高层的功能丰富的类 // 逐步添加功能 // 独立定义新装饰器 // 来自它们扩展的对象类 // 即使是不可预见的扩展 // 装饰器及其组件不相同 // 很多小物体 //+------------------------------------------------------------------+ //|实施 | //+------------------------------------------------------------------+ // 接口一致性 > 装饰器组件 // 省略抽象装饰器类 - 如果是单一责任 // 保持组件轻量化 // 改变对象的外观与改变其内部 > 策略 //+------------------------------------------------------------------+ //|相关模式 | //+------------------------------------------------------------------+ // 适配器 > 将为对象提供一个全新的接口 // 装饰器 > 更改对象的职责,而不是其接口 // 合成的 // 装饰器 — 是一种只有一个组件的简并复合体 — // 不适用于对象聚合 // 策略 > 改变对象的内部结构 // 装饰器 > 更改对象的外观 //+------------------------------------------------------------------+
附件下载
📎 pattern.mq5 (2.21 KB)
📎 patternorganizer.mqh (13.31 KB)
📎 decorator.mqh (22.3 KB)
Source: MQL5 #30969
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
