2011-03-24 73 views
6

我对示例复合类图中通常看到的两个操作有疑问。
* GetDescendents
* GetChild(INT)复合图案设计问题

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

所以问题一,是不是你可能有一个组合的GetImageFiles方法,而不是让客户端弄清楚它?假设是这样的,GetDescendents是否可以在组合之外公开给客户端调用者(如ImageViewer)?

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

干杯,
Berryl

回答

4

这些问题是不是复合模式本身,而是关于你如何做API设计和毫不含糊地传达你的意图为一类开发者更大的问题。例如,如果你想让你的GetChild(int)给予索引的直接孩子,你可以命名它GetChildAtIndex(int index);如果你想让它在层次结构中的某个级别上给孩子,你可以命名它GetChildrenAtLevel(int level)(注意这是复数并返回一个集合)。

作为一名班级设计师,您需要公开足够的操作以使您的班级易于理解和使用。如果您认为一个非常常见的操作是将图像文件放到目录结构中,则可以使用GetAllImageFiles()方法。尽管如此,对于更一般的目录类来说,这种选择似乎是任意的,并且处于错误的抽象层次。为什么图像文件如此特别?相反,您可以提供一种更通用的方法,可以根据扩展名获取所有文件,也可以根据客户端提供的条件使用谓词来筛选结果。正确。

+0

没错。我的问题是,它是否有助于将儿童操作暴露给不属于构图的客户,或者至少与其构成非常密切的关系 - 也就是说,它们是内部操作来生成客户端消费品,如GetFilesOfType ()。 – Berryl 2011-03-24 15:19:51

+0

@Berryl:这取决于你的班级代表什么。 “模式”只是一个实现细节,重要的是“概念”。 – 2011-03-24 15:23:22