我经常读/听到复合模式是表示诸如二进制树之类的分层数据结构的好解决方案,因为内部节点是composite
对象而叶子是{{1 }}对象。我可以理解,使用这种模式很容易以统一的方式访问每个元素。
但是,如果您正在考虑按需填充树(每次执行leaf
方法),我不确定是否是最好的例子,因为我们必须转换{{1} }至insert
的对象多次(例如,leaf
必须添加一个子对象时)。要转换一个composite
对象,我想像一个复杂的方法(我猜想是受Smalltalk的leaf
启发):
leaf
总而言之,如果这种结构出生时通常是空的,那么您必须添加/插入元素,这是使用树状结构来说明复合模式的好例子吗?
答案 0 :(得分:1)
GoF声明Composite的 Intent 如下:
“将对象组成为树结构以表示整体层次结构....统一对待单个对象和对象组成”
因此,树不是用来说明Composite的结构,而是树是定义和操作Composite的结构。还值得记住的是,对于Composite而言,树可以是二叉树(2个子代),链表(一个子代)或可以由具有可变数量的子代的节点组成。
从零开始建造一棵树是很正常的。考虑一个算术表达式解析器,构建一个复合的“解析”树。解析器将从零开始,并为终端符号(例如+-* /大括号,数字)创建叶节点,并创建组合节点以结合终端来执行计算。解析器构造树,以便在头节点上调用Evaluate()将导致遍历以评估表达式。
我使用此示例说明可以自底向上构建一棵树,而不必“将叶子转换为复合对象”。
如果您的应用程序自上而下或分阶段逐步构建树,则很难理解这很重要,因为构建过程将包括创建适当的节点并以对应用程序有意义的方式插入它们。
如果在任何特定的应用程序中将叶节点转换为复合节点都是有问题的,那么可以肯定的是,您要寻找在这种情况下将开销最小化的方法。但是,在构建树时,它只是一个有效的Composite结构!