复合图案设计问题

Ber*_*ryl 6 design-patterns composite

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

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

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

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

干杯,
Berryl

Jor*_*dão 4

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

例如,如果您希望GetChild(int)给出索引的直接子代,您可以将其命名为GetChildAtIndex(int index); 如果您希望它给层次结构中某个级别的子级,您可以命名它GetChildrenAtLevel(int level)(请注意,这是复数并返回一个集合)。

作为类设计者,您有责任公开足够的操作以使您的类易于理解和使用。如果您认为一个非常常见的操作是获取目录结构上的图像文件,您可以公开一个GetAllImageFiles()方法。但对于更通用的目录类,这种选择似乎是任意的,并且处于错误的抽象级别。为什么图像文件如此特殊?相反,您可以提供一种更通用的方法,该方法将根据扩展名获取所有文件,或者提供一种采用谓词根据客户端提供的条件过滤结果的方法。