我的問題是關於如何最好地創建可變深度層次結構。 假設我希望能夠將產品放入類別層次結構中,但層次結構的深度因不同產品而異。創建可變深度類別的最佳方法?
例如,法拉利可能屬於類別車輛 - >車 - >運動 而LED 3D電視可能在電子產品 - >電視 - > LED - > 3D。
希望你有這個想法:-) 什麼是最好的方式來建模?我應該創建一個可以容納自身列表的類別對象,或許還有一個布爾屬性來告訴當前對象是否是葉節點?其他建議?`
或者我應該只是嘗試很難有一個固定的深度我的層次結構?
我的問題是關於如何最好地創建可變深度層次結構。 假設我希望能夠將產品放入類別層次結構中,但層次結構的深度因不同產品而異。創建可變深度類別的最佳方法?
例如,法拉利可能屬於類別車輛 - >車 - >運動 而LED 3D電視可能在電子產品 - >電視 - > LED - > 3D。
希望你有這個想法:-) 什麼是最好的方式來建模?我應該創建一個可以容納自身列表的類別對象,或許還有一個布爾屬性來告訴當前對象是否是葉節點?其他建議?`
或者我應該只是嘗試很難有一個固定的深度我的層次結構?
表示類別的模型可能是一棵樹(具有不可見的根節點,「開始」或其他)。每個類別有一個父母和一個或多個孩子類別。
然後,對於該產品,請向該產品添加類別列表。這非常靈活,因爲有一天您可能會考慮將不同類別的產品列出。
該類別類非常基本的模式:
public class Category {
private List<Category> children = new ArrayList<Category>();
private Category parent;
private String name;
// private constructor
private Category(Category parent, String name) {
this.parent = parent;
this.name = name;
}
// adds a category to this category
public Category addCategory(String name) {
Category child = new Category(this, name);
children.add(child);
return child;
}
// creates and returns a new categories tree
public static Category createCategories() {
return new Category(null, "root");
}
}
有許多選擇,你可以做,但我會像
class Product
{
private Category category;
// ...
}
class Category
{
private Category parent;
private String name;
public Category getParent() { return parent; }
public boolean isTopLevelCategory() { return parent == null }
public String getName() { return name; }
public String getFullName() {
if(isTopLevelCategory())
return name;
else
return parent.getFullName() + " -> " + name;
}
// ....
}
產品知道自己的類別(在最具體的水平 - 所以法拉利是在「體育」)
分類知道他們的父母,所以「Sp orts「指向」Cars「,」Cars「指向」Vehicles「,」Vehicles「指向null,因爲它是頂級類別。
如果您需要以這種方式存儲,那麼這也可以很好地映射到SQL數據庫。
儘管如此,您仍然需要決定如何存儲所有可用類別的列表。另外,如果您需要能夠從頂級類別轉到其所有子級,那麼您可能還需要存儲這些反向鏈接。
您對Category
物體的建議聽起來很對我。 composite pattern可能匹配得很好。
我也喜歡Andreas_D將產品和類別層次結構分離的想法。
這看起來很像我心中的想法,但不能完全沉浸在代碼中。至少,我會用這種方法爲初學者:-)感謝您的回答! – Daniel 2011-02-03 18:17:50