C++ 在树状视图中使用复合模式有意义吗?

C++ 在树状视图中使用复合模式有意义吗?,c++,oop,design-patterns,composite,C++,Oop,Design Patterns,Composite,我有一个树状视图,其中每个节点都是不同类型的项-只有label和description属性相同。用复合组件表示每个节点项有意义吗 我问这个问题的原因之一是,我注意到,当应用复合设计模式使应用聚合函数(应用于聚合对象)变得更容易时,实际访问该聚合中的单个项变得有些困难 这通常意味着要访问单个项,需要将项转换回其原始类型,或者需要包含类型信息,这在OOP中被认为是一种不好的做法。在常见的示例中,这些内部对象并没有真正公开 从这个角度来看,考虑一下我有3个主要城市的旅游景点。节点的第一级是城市名称,它

我有一个树状视图,其中每个节点都是不同类型的项-只有label和description属性相同。用复合组件表示每个节点项有意义吗

我问这个问题的原因之一是,我注意到,当应用复合设计模式使应用聚合函数(应用于聚合对象)变得更容易时,实际访问该聚合中的单个项变得有些困难

这通常意味着要访问单个项,需要将项转换回其原始类型,或者需要包含类型信息,这在OOP中被认为是一种不好的做法。在常见的示例中,这些内部对象并没有真正公开

从这个角度来看,考虑一下我有3个主要城市的旅游景点。节点的第一级是城市名称,它包含该城市中的景点

New York
   Time Square
   Central Park
London
   British Meuseum
Paris
   Eiffel Tower
所以现在当用户点击城市时,程序会显示该城市的信息(比如在右窗格中),如果用户点击景点,程序会显示该景点的信息

这是否适合复合设计模式?如果是这样的话,难道不需要将组件类型转换回它到底是什么样的城市或景点吗

第二,这难道不需要从组合中挖掘出组件才能显示它吗?有点违背了把它们放在一起的模式


如果重要的话,我的环境是C++/Qt。

快速简短回答

不,您不必使用“复合”软件设计模式,您可以用自己的特定类/类型声明每个项

冗长乏味的扩展答案

你没有

集合,如堆栈、列表、矩阵(矩阵的复数形式)以及特别是树状集合是使用此模式的自然方式,其中所有项都属于相同的类或类型,或者可以表现为具有相同的类、类型或接口,即使它们具有不同的类型

然而,在许多情况下,更倾向于使用它,并用相同的类型声明所有项,如相同的超类或相同的接口, 因为它允许对所有元素执行公共操作

您可能会发现一些GUI界面和控件,如QT, 将此模式应用于不完全相同类的元素, 只是因为他们需要打印每个元素的图像或标签

从一般类向后或向前投射到特定类, (也称为“差异”和“对冲”),在每个项目中, 可能很复杂,但在logn术语编程中可能很有用

注意:如果使用原型或接口继承,同样适用, 而不是类继承,以实现此模式

摘要

软件设计模式和最佳实践是指导原则,而不是严格的规则,这意味着它们在某些情况下是有用的,而在其他情况下不是很有用

您可以明确避免使用它们, 如果你理性地认为它不适合你的需要