编程模式 - 复合 - MetaTrader 5 库


/********************************************************************
编程模式:复合模式
将对象组合成树结构以表示部分-整体层次结构。
复合允许客户统一处理单个对象和对象组合。
/**/ /********************************************************************/ 班级成分//抽象(接口) {民众: 虚拟的 空白 运算()=0; 虚拟的 空白 添加(组件*)=0; 虚拟的 空白 删除(组件*)=0; 虚拟的组件* GetChild(整数)=0; 组件() {} 组件(细绳名称):mname(名称) {}受保护的: 细绳 名称; };/********************************************************************/ 班级叶子:民众成分 {民众: 空白 手术() {打印(名字);} 空白 添加(组件*){} 空白 删除(组件*){} 组件* GetChild(整数){返回 无效的;} 叶子(细绳名称):组件(名称){} };/********************************************************************/ 班级合成的:民众成分 {民众: ObjectList节点; 空白 手术() {打印(名字);整数c=nodes.Count();为了(整数我=0;我 空白 Add(Component*c) {nodes+=c;} 空白 删除(组件*c) {节点-=c;} 组件* GetChild(整数我) {返回节点[i];} 复合材料(细绳名称):组件(名称){} };/**/
/********************************************************************
适用性
使用复合模式时
你想要表示对象的部分-整体层次结构。
您希望客户能够忽略成分之间的差异
对象和单个对象。客户端将处理组合中的所有对象
结构均匀。
参加者
组件
声明组合中对象的接口。
实现所有类共有的接口的默认行为,如
适当的。
声明一个用于访问和管理其子组件的接口。
(可选)定义一个用于访问组件父级的接口
递归结构,并在适当的情况下实现它。
叶
代表组合中的叶子对象。一片叶子没有孩子。
定义组合中原始对象的行为。
复合材料
定义有子组件的行为。
存储子组件。
在 Component 接口中实现与子级相关的操作。
客户
通过 Component 接口操作组合中的对象。
合作
客户端使用 Component 类接口与对象中的对象进行交互
复合结构。如果接收者是叶子,则处理请求
直接。如果接收者是复合体,那么它通常会将请求转发到其
子组件,可能在之前和/或之后执行附加操作
转发。
后果
复合模式
定义由原始对象和复合对象组成的类层次结构。
原始对象可以组合成更复杂的对象,而更复杂的对象又可以
被组合,递归地依此类推。只要客户端代码需要原语
对象,它也可以采用复合对象。
让客户端变得简单。客户可以处理复合结构和个体
物体均匀。客户通常不知道(也不应该关心)是否
他们正在处理一片叶子或一个复合组件。这简化了客户端
代码,因为它避免了编写标记和案例语句样式的函数
超过定义组合的类。
使得添加新类型的组件变得更加容易。新定义的复合或
叶子类自动与现有结构和客户端代码一起工作。
不必为新的组件类更改客户端。
会让你的设计过于笼统。缺点是容易添加
新组件的优点是它使得限制组件的难度变得更加困难
复合。有时您希望复合材料仅包含某些组件。 使用 Composite,您不能依赖类型系统来强制执行这些约束
为了你。您必须改用运行时检查。
/**/ /******************************************************************** 复合模式使用示例。客户 /****************************************************************/ 空白 启动时() { /*根*/ 分量*根=新的合成的(“根”);//动态 // = 复合根("ROOT"); //汽车 /*部分*/ 组件*分支1=新的合成的(“ 分支 1”); 组件*分支2=新的合成的(“ 分支 2”); 组件*叶1=新的叶子(“ 叶子 1”); 组件*叶2=新的叶子(“ 叶子 2”); /*构建树*/ 根.添加(无效的); //误... 根.添加(branch1); 根.添加(branch2); 分支1.Add(叶1); 分支1.添加(叶2); 分支2.添加(叶2); 分支2.添加(新的叶子(“ 叶子 3”)); //通过引用添加部分(非var) root.Operation(); //查看 {细绳s;为了(整数我=0;我<13; i++) {s+=“-”;}打印(s);} /*删除整个分支*/ 根.删除(branch1); root.Operation(); //查看 /*删除根目录*/ 删除根; }/******************************************************************** 输出: /** 根 分行1 叶 1 叶2 分行2 叶2 叶 3 ------------- 根 分行2 叶2 叶 3 /**/
附件下载
📎 composite.mq5 (2.67 KB)
📎 composite.mqh (4.44 KB)
📎 objectlist.mqh (6.64 KB)
Source: MQL5 #29767
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
