创建变深度类别的最佳方法是什么?

时间:2011-02-03 06:43:51

标签: java design-patterns

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

例如,法拉利可能属于车辆类别 - >汽车 - >体育 而LED 3D电视可能在电子产品中 - >电视 - > LED - > 3D。

希望你能得到这个想法:-) 对此进行建模的最佳方法是什么?我应该创建一个可以保存自身List的Category对象,可能是一个布尔属性,告诉当前对象是否是叶子节点?其他建议?`

或者我应该真的尝试很难为我的层次结构设置一个固定的深度?

3 个答案:

答案 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的想法来解耦产品和类别层次结构。