复合图案设计问题

时间:2011-03-24 14:52:45

标签: design-patterns composite

我有一个关于您在示例复合类图中常见的两个操作的问题 * GetDescendents
* GetChild(int)

一个常见的例子是文件和目录,我会坚持这一点。假设感兴趣的操作是Size,因此File具有实际大小,Directory具有从GetDescendents的递归迭代派生的Size。到现在为止还挺好。我的问题与客户使用GetDescendents有关。假设您需要目录中的文件,这些文件是某些给定操作的图像。因此在实践中,您使用GetDescendents和Children的某些组合来返回imageFiles(取决于客户端是否需要所有嵌套的imageFiles或仅在根级别)。

所以问题一,是不是你可能在复合上有一个GetImageFiles方法而不是让客户想出来?假设是这样,GetDescendents是否可以在合成之外向客户端调用者(如ImageViewer)公开?

关于GetChild(int)的第二个问题;是一个返回单个孩子的序数位置索引? GetDescendents的深度级别?什么是客户端如何使用该方法的示例?

干杯,
Berryl

1 个答案:

答案 0 :(得分:4)

这些问题不是关于复合模式本身,而是关于如何进行API设计以及明确沟通作为类开发人员的意图的更大问题。

例如,如果您希望GetChild(int)为已编入索引的直接子项提供帮助,则可以将其命名为GetChildAtIndex(int index);如果你想让它在层次结构中给予某个级别的孩子,你可以将其命名为GetChildrenAtLevel(int level)(注意这是复数并返回一个集合)。

作为一名班级设计师,您需要公开足够的操作,以使您的课程易于理解和使用。如果您认为一个非常常见的操作是在目录结构上获取图像文件,则可以公开GetAllImageFiles()方法。但是对于更通用的目录类,这个选择似乎是任意的,它处于错误的抽象层次。为什么图像文件如此特别?相反,您可以提供一种更通用的方法,可以根据扩展名获取所有文件,也可以提供一种方法,根据客户提供的标准对谓词进行过滤。