Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在遵循复合模式的数据结构中增加元素_Java_Design Patterns_Composite - Fatal编程技术网

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

Java 在遵循复合模式的数据结构中增加元素,java,design-patterns,composite,Java,Design Patterns,Composite,我经常读到/听说复合模式是表示二叉树等分层数据结构的一个很好的解决方案,解释这种模式很好,因为内部节点是composite对象,而叶子是leaf对象。我可以理解,使用这种模式,很容易以统一的方式访问每个元素 但是,如果您认为树是按需填充的(每次执行insert方法),我不确定这是否是最好的示例,因为我们必须多次将leaf转换为composite对象(例如,当leaf必须添加子对象时)。要转换leaf对象,我设想了一种复杂的方法,比如(受Smalltalk的启发:): 总而言之,如果这种结构生来通

我经常读到/听说复合模式是表示二叉树等分层数据结构的一个很好的解决方案,解释这种模式很好,因为内部节点是
composite
对象,而叶子是
leaf
对象。我可以理解,使用这种模式,很容易以统一的方式访问每个元素

但是,如果您认为树是按需填充的(每次执行
insert
方法),我不确定这是否是最好的示例,因为我们必须多次将
leaf
转换为
composite
对象(例如,当
leaf
必须添加子对象时)。要转换
leaf
对象,我设想了一种复杂的方法,比如(受Smalltalk的
启发:
):


总而言之,如果这种结构生来通常是空的,那么您必须添加/插入元素,那么使用树状结构来说明复合模式是一个很好的例子吗

GoF将复合材料的意图声明如下:

“将对象组合到树结构中,以表示部分-整体层次结构……统一处理单个对象和对象的组合”

因此,树与其说是一个结构来说明复合,不如说是一个树,它是定义复合和操作复合的结构。还值得记住的是,为了复合的目的,树可以是二叉树(2个子树)、链表(一个子树),也可以由具有可变子节点数的节点组成

从无到有造一棵树是很正常的。考虑一个算术表达式分析器,构建一个复合的“解析”树。解析器将从无到有,为终端符号(如+-*/大括号、数字)和组合节点创建叶节点,以组合终端执行计算。解析器构造树,以便在head节点上调用evaluate()将导致遍历来计算表达式

我用这个例子来说明树可以自下而上构建,而不必“将叶子转换为复合对象”

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


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

见下文。按照我的理解,我试着回答你的问题,但如果我没有抓住要点,一定要要求更多的澄清!好的,我喜欢这个答案。但是,如果已经有了树的最终表示形式,那么树状结构的复合模式就可以了,但是如果树在演化过程中包含了更多或更少的元素,那么复合模式就不行了。我可以理解这两个示例(数学表达式和解析器),但您认为树结构已经完成。IMHO,前面的示例非常常见/易于说明复合模式的好处。如果您遇到树不断被重新构建(比如向解析器提供不同的表达式)的情况,或者遇到需要调整树的业务情况,那么它仍然是复合的,当树或某个迭代可以从头节点“执行”并且所有节点都具有遍历树的逻辑时提供。我们说的是同一件事,还是你的看法仍然不同?
aComposite = aLeaf.becomeComposite();
aComposite.addChild(newElement);
//destroy aLeaf (bad time performance)