创建可变深度类别的最佳方法?
问题描述:
我的问题是关于如何最好地创建可变深度层次结构。 假设我希望能够将产品放入类别层次结构中,但层次结构的深度因不同产品而异。创建可变深度类别的最佳方法?
例如,法拉利可能属于类别车辆 - >车 - >运动 而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数据库。
尽管如此,您仍然需要决定如何存储所有可用类别的列表。另外,如果您需要能够从*类别转到其所有子级,那么您可能还需要存储这些反向链接。
这看起来很像我心中的想法,但不能完全沉浸在代码中。至少,我会用这种方法为初学者:-)感谢您的回答! – Daniel 2011-02-03 18:17:50