2011-02-03 2 views
1

Мой вопрос касается того, как наилучшим образом создать иерархию переменной глубины. Предположим, что я хочу, чтобы я мог поместить продукт в иерархию категорий, однако глубина иерархии отличается для разных продуктов.Лучший способ создать категорию переменной глубины?

Например, Ferrari может быть в категории Vehicle -> Car -> Sports , а светодиодный 3D-телевизор может быть в электронике -> TV -> LED -> 3D.

Надеюсь, вы получите эту идею :-) Что было бы лучшим способом смоделировать это? Должен ли я создать объект Category, который может содержать список сам по себе, возможно, с логическим атрибутом, указывающим, является ли текущий объект листовым узлом или нет? Другие предложения? `

Или мне просто нужно ДЕЙСТВИТЕЛЬНО трудно иметь фиксированную глубину для моих иерархий?

ответ

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

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; 
    } 

    // .... 
} 

продукта знает свою категорию (самый определенный уровень - так что Ferrari находится в «Sports»)

Категории знают своих родителей, поэтому «Sp орты "указывает на« Автомобили »,« Автомобили »указывает на« Транспортные средства »,« Транспортные средства »указывают на нуль, поскольку это категория верхнего уровня.

Это также хорошо отразится на базе данных SQL, если вам нужно сохранить его таким образом.

Вам все равно нужно решить, как сохранить список всех доступных категорий.

Кроме того, если вам нужно быть в состоянии перейти от категории верхнего уровня ко всем своим детям, то вы, вероятно, захотите также сохранить эти обратные ссылки.

0

Ваше предложение с объектом Category звучит прямо для меня. composite pattern может очень хорошо сочетаться.

Мне также нравится идея Andreas_D разделить продукты и иерархию категорий.

Смежные вопросы