2011-02-03 44 views
1

我的問題是關於如何最好地創建可變深度層次結構。 假設我希望能夠將產品放入類別層次結構中,但層次結構的深度因不同產品而異。創建可變深度類別的最佳方法?

例如,法拉利可能屬於類別車輛 - >車 - >運動 而LED 3D電視可能在電子產品 - >電視 - > LED - > 3D。

希望你有這個想法:-) 什麼是最好的方式來建模?我應該創建一個可以容納自身列表的類別對象,或許還有一個布爾屬性來告訴當前對象是否是葉節點?其他建議?`

或者我應該只是嘗試很難有一個固定的深度我的層次結構?

回答

2

表示類別的模型可能是一棵樹(具有不可見的根節點,「開始」或其他)。每個類別有一個父母和一個或多個孩子類別。

然後,對於該產品,請向該產品添加類別列表。這非常靈活,因爲有一天您可能會考慮將不同類別的產品列出。


該類別類非常基本的模式:

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"); 
    } 
} 
+0

這看起來很像我心中的想法,但不能完全沉浸在代碼中。至少,我會用這種方法爲初學者:-)感謝您的回答! – Daniel 2011-02-03 18:17:50

0

有許多選擇,你可以做,但我會像

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數據庫。

儘管如此,您仍然需要決定如何存儲所有可用類別的列表。另外,如果您需要能夠從頂級類別轉到其所有子級,那麼您可能還需要存儲這些反向鏈接。

0

您對Category物體的建議聽起來很對我。 composite pattern可能匹配得很好。

我也喜歡Andreas_D將產品和類別層次結構分離的想法。