2011-03-24 69 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