1、基本概念
组合模式是一种结构型设计模式,是将对象组合成树形结构以表示"部分-整体"的层次结构。以便于使用简单的部分来创建复杂的对象。
2、实现的类
2.1 Component(抽象构件): 抽象构件通常是一个抽象基类,它定义了组合模式中所有对象共同的接口。
2.2 Leaf(叶子构件): 叶子构件是组合模式中的最小单元,它不包含其他子对象。在 Qt 中,可以创建继承自 Component 的具体类。
2.3 Composite(容器构件): 容器构件是组合模式中包含其他组件的对象。在 Qt 中,可以创建继承自 Component 的容器类,并拥有一个存储子组件的容器。
3、使用场景
适用于处理具有层次结构的对象集合;
并且希望以统一的方式对整个结构进行操作,并且可以忽略层次的差异;
可以对叶子和容器进行分离,并且可以增加类型。
4、实现:QObject和对象树
QObject 是 Qt 中的元对象(Meta Object)基类之一,用于支持 Qt 的元对象系统。 任何一个QObject 对象都可以组成一个树形结构,每个节点都是一个 QObject 对象,子节点可以是其他 QObject 对象。
每当我们创建一个继承于 QObject 的 Qt 对象时,将会自动创建一个构造函数如下
explicit MyObject(QObject *parent = nullptr);
这里的 parent 就是为这个对象指定一个父类对象。
每个 QObject 都可以有(至多)一个父 QObject ,且可以拥有任意数量的子 QObject, 换句话说,每个子对象的类 型必须是 QObject 或者必须派生自 Q Object 。每个 QO bject 都将指向各个 子对 象的指针存放在 QObj ectList 中。
每个 QOb ject 父对象都会管理自己的子对象, 这就意味着,在调用 QObject 的析构函数时会自动销毁该对象的子对象。
子对象列表会在各个 QObject 对象之间建立一种双向的关联:
每个父对象都知道它的子对象的地址。
每个子对象都知道其父对象的地址。
QT创建对象树的例子如下:
QObject *root = new QObject();
QObject *child1 = new QObject(root);
QObject *child2 = new QObject(root);
QObject *grandchild1 = new QObject(child1);
QObject *grandchild2 = new QObject(child1);
其对象树结构为:
其中,作为父对象的root可以管理,查找,删除,遍历子对象。
这便是组合模式中的"部分-整体"的层次结构。
原文链接:https://blog.csdn.net/buhuiCyvyan/article/details/138248411