Design patterns 复合图案设计问题

Design patterns 复合图案设计问题,design-patterns,composite,Design Patterns,Composite,我有一个关于在示例复合类图中常见的两个操作的问题。 *获取子代 *GetChild(int) 一个常见的例子是文件和目录,我将坚持使用它。让我们假设感兴趣的操作是Size,所以文件有一个实际大小,而目录有一个从getsubstants的递归迭代中派生出来的大小。到现在为止,一直都还不错。我的问题与客户机使用getgrounds有关。假设您需要某个目录中的文件,这些文件是某些给定操作的图像。因此,在实践中,您可以使用getsubstants和Children的某种组合来返回imagefile(取决

我有一个关于在示例复合类图中常见的两个操作的问题。
*获取子代
*GetChild(int)

一个常见的例子是文件和目录,我将坚持使用它。让我们假设感兴趣的操作是Size,所以文件有一个实际大小,而目录有一个从getsubstants的递归迭代中派生出来的大小。到现在为止,一直都还不错。我的问题与客户机使用getgrounds有关。假设您需要某个目录中的文件,这些文件是某些给定操作的图像。因此,在实践中,您可以使用getsubstants和Children的某种组合来返回imagefile(取决于客户端是需要所有嵌套的imagefile,还是仅在根级别)

因此,第一个问题是,您不可能在组合中使用GetImageFiles方法,而不是让客户机了解它吗?假设是这样,GetDegents在构图之外向客户机调用者(如ImageViewer)公开是否切实可行

关于GetChild(int)的第二个问题;int是返回单个子级的顺序位置索引吗?一个深入的层次?客户如何使用该方法的示例是什么

干杯,

Berryl

这些问题并不是关于复合模式本身,而是关于如何进行API设计和明确传达您作为类开发人员的意图这一更大的问题

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


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

确切地说。我的问题是,将子操作暴露给不属于该组合的客户机,或者至少与之有着非常密切的关系的客户机是否有意义?也就是说,它们是生成客户机可消费的操作的内部操作,如GetFileSoftType()。@Berryl:这取决于您的类代表什么。“模式”只是一个实现细节,重要的是“概念”。