创建可变深度类别的最佳方法?

问题描述:

我的问题是关于如何最好地创建可变深度层次结构。 假设我希望能够将产品放入类别层次结构中,但层次结构的深度因不同产品而异。创建可变深度类别的最佳方法?

例如,法拉利可能属于类别车辆 - >车 - >运动 而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"); 
    } 
} 
+0

这看起来很像我心中的想法,但不能完全沉浸在代码中。至少,我会用这种方法为初学者:-)感谢您的回答! – Daniel 2011-02-03 18:17:50

有许多选择,你可以做,但我会像

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将产品和类别层次结构分离的想法。