Лучший способ создать категорию переменной глубины? - PullRequest
1 голос
/ 03 февраля 2011

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

Например, Ferrari может быть в категории Транспортное средство -> Автомобиль -> Спорт, в то время как светодиодный 3D-телевизор может быть в электронике -> Телевизор -> LED -> 3D.

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

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

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Модель для представления категорий может быть деревом (с невидимым корневым узлом, «началом» или чем-то еще). Каждая категория имеет одного родительского и одну или несколько дочерних категорий.

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


Очень базовая модель для категории:

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 голосов
/ 03 февраля 2011

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

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

0 голосов
/ 03 февраля 2011

Есть несколько вариантов, которые вы могли бы сделать, но у меня было бы что-то вроде

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 находится в «Спорт»)

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...