我的问题是如何最好地创建可变深度层次结构。 假设我希望能够将产品放在类别层次结构中,但是层次结构的深度因不同的产品而异。
例如,法拉利可能属于车辆类别 - >汽车 - >体育 而LED 3D电视可能在电子产品中 - >电视 - > LED - > 3D。
希望你能得到这个想法:-) 对此进行建模的最佳方法是什么?我应该创建一个可以保存自身List的Category对象,可能是一个布尔属性,告诉当前对象是否是叶子节点?其他建议?`
或者我应该真的尝试很难为我的层次结构设置一个固定的深度?
答案 0 :(得分: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");
}
}
答案 1 :(得分: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;
}
// ....
}
产品知道他们的类别(最具体的水平 - 所以法拉利在“运动”)
类别知道他们的父母,所以“体育”指向“汽车”,“汽车”指向“车辆”,“车辆”指向空,因为它是顶级类别。
如果您需要以这种方式存储它,那么它也可以很好地映射到SQL数据库。
您仍然需要决定如何存储所有可用类别的列表。
此外,如果您需要能够从顶级类别转到所有孩子,那么您可能也希望存储这些反向链接。
答案 2 :(得分:0)
您对Category
对象的建议听起来对我不对。 composite pattern可能非常匹配。
我也喜欢Andreas_D的想法来解耦产品和类别层次结构。