在树视图中使用复合模式是否有意义?

时间:2016-01-26 05:11:04

标签: c++ oop design-patterns composite

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

我问的一个原因是我注意到在应用复合设计模式时更容易应用聚合函数(应用于聚合对象),实际访问聚合内部的单个项目变得更加困难。

这通常意味着访问单个项目,它需要将项目类型转换回其原始类型,或者它需要包含在OOP中被视为不良做法的类型信息。在常见的例子中,这些内部对象并未真正暴露出来。

为了正确看待这个问题,请考虑我有TreeView,它显示了3个主要城市的旅游景点。第一级节点是城市名称,其中包含该城市的景点。

New York
   Time Square
   Central Park
London
   British Meuseum
Paris
   Eiffel Tower

现在,当用户点击城市时,程序会显示有关该城市的信息(例如在右侧窗格中),如果他们点击该景点,则会显示该景点的信息。

这适合复合设计模式吗?如果是这样,它不需要将组件类型转换回城市或景点的确切位置吗?

其次不需要从复合材料中挖出组件才能显示它?那种倾向于将它们组合在一起的模式?

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

1 个答案:

答案 0 :(得分:0)

快速简答

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

长期无聊的答案

你没有。

集合,如堆栈,列表,矩阵(矩阵的复数)以及特殊的树状集合是使用此模式的自然方式,其中所有项目具有相同的类或类型,或者可以表现得像它们一样相同的类,类型或接口,即使它们具有不同的类型。

然而,在许多情况下,最好使用它,并声明所有具有相同类型的项目,如相同的超类或相同的接口, 因为它允许对所有元素执行常见操作。

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

从普通类向后或向前转换到特定类, (在每个项目中,也称为"方差"和"逆变") 可能很复杂,但在登录术语编程中很有用。

注意:如果您使用原型或接口继承,则同样适用, 而不是类继承,来实现这种模式。

<强>摘要

软件设计模式和最佳实践是指导原则,而不是严格的规则,这意味着它们在某些情况下可能会有所帮助,而在其他情况下则没那么有用。

你可以明确地避免使用它们, 如果你理性地相信它并不适合你的需要。