基本概念
组合模式是一种结构型设计模式,是将对象组合成树形结构以表示"部分-整体"的层次结构。以便于使用简单的部分来创建复杂的对象。
实现的类
- Component(抽象构件): 抽象构件通常是一个抽象基类,它定义了组合模式中所有对象共同的接口。
- Leaf(叶子构件): 叶子构件是组合模式中的最小单元,它不包含其他子对象。在 Qt 中,可以创建继承自 Component 的具体类。
- Composite(容器构件): 容器构件是组合模式中包含其他组件的对象。在 Qt 中,可以创建继承自 Component 的容器类,并拥有一个存储子组件的容器。
使用场景
- 适用于处理具有层次结构的对象集合。
- 并且希望以统一的方式对整个结构进行操作,并且可以忽略层次的差异。
- 可以对叶子和容器进行分离,并且可以增加类型。
实现: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可以管理,查找,删除,遍历子对象。
这便是组合模式中的"部分-整体"的层次结构。