在遵循复合模式的数据结构中增加元素

Increasing elements in a data structure that follows the Composite pattern

我经常 read/heard 认为复合模式是表示像二叉树这样的分层数据结构的很好的解决方案,解释这种模式很好,因为内部节点是 composite objects和叶子是leafobjects。我很欣赏使用这种模式,可以很容易地以统一的方式访问每个元素。

但是,如果您考虑到树按需填充(每次执行 insert 方法),我不确定这是否是最好的例子,因为我们必须转换 leafcomposite object 多次(例如,当 leaf 必须添加 child 时)。要转换 leaf object,我想像一个棘手的方法(我猜是受 Smalltalk 的 become: 启发):

aComposite = aLeaf.becomeComposite();
aComposite.addChild(newElement);
//destroy aLeaf (bad time performance) 

综上所述,使用tree-like结构来说明复合模式是不是一个很好的例子,如果这种结构通常是空的,那么你必须要add/insert个元素?

GoF 声明 Composite 的 Intent 如下:

"Compose objects into tree structures to represent part-whole hierarchies. ..... treat individual object and compositions of objects uniformly"

因此,树与其说是说明复合材料的结构,不如说是树是定义和操作复合材料的结构。同样值得记住的是,为了 Composite 的目的,树可以是二叉树 (2 children)、链表 (one child) 或者可以由具有可变数量的节点组成child任.

白手起家很正常。考虑一个算术表达式解析器,构建一个复合 "parse" 树。解析器将从零开始,为终端符号(如 + - * / 大括号、数字)和复合节点创建叶节点以组合终端执行计算。解析器构造树,以便在头节点上调用 evaluate() 将导致遍历以评估表达式。

我用这个例子来证明一棵树可以自下而上地构建,而不必 "convert a leaf to composite object"。

如果您的应用程序自上而下或分阶段逐步构建树,则很难看出这很重要,因为构建过程将包括创建适当的节点并以对应用程序有意义的方式插入它们。

如果在任何特定应用程序中将叶节点转换为复合节点都存在问题,那么您一定要寻找在这种情况下最小化开销的方法。但在构建树时它只是一个有效的复合结构!