2012-06-09 5 views
3

мне сказали «модель абстрактного контейнера для объектов базы данных, конструкции, принимающих на ребенок с переменным числом аргументов, а затем предоставляет некоторые функциональные возможности детей инспекционного без кода повторения».Там должна быть лучшим способом закодировать это :(

Это намеки например, «подсчет числа детей», «найти по идентификатору» и т. д.

Для простоты приведенный ниже код имеет только одно поле из базового абстрактного типа DatabaseObject (то есть имя), но у реального кода есть такие вещи, как «идентификатор» и некоторые сложные поисковые трюки метаданных.

Идея этого, безусловно, использоватьфу Я просто смотрел на то, что начал писать, заставляет меня хотеть поцеловать: это будет Франкенштейном в запутывании, если я продолжу путь по этому пути. Любой способ сделать это достойной Java? Любой шаблон проектирования для ссылки? (Composite приходит на ум ...)

Помещение: фактическая функциональность, которая будет использоваться совместно, полезна и действительно применима к любым потенциальным гнездовым типам (схемы имеют таблицы, таблицы имеют столбцы, CompositeIndex (ы) имеют субиндексы и т. Д. .), особенно поиск идентификаторов ...

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

Помощь :)

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject> 
    extends DatabaseObject { 
    protected List<ChildType> children; 
    public DatabaseContainerObject(String name, ChildType... children) { 
    super(name); 
    this.children = new ArrayList<ChildType>(children.length); 
    this.children.addAll(Arrays.asList(children)); 
    } 
    protected List<ChildType> getChildren() { 
    return Collections.unmodifiableList(children); 
    } 
    ... count ... 
    ... find ... 
    ... sort ... 
    ... remove ... 
    ... 
} 
+2

Да ясно случай для композит. Например. если вы хотите найти что-то в композите, всегда сначала проверяйте, удовлетворяете ли вы предикату (затем верните это или что-то еще), иначе вызовите find для всех детей. – Voo

ответ

0

Composite приходит на ум очень быстро, но вы должны также исследовать декоратор.

Поиск явно идет рекурсивно, но граф, например. очень ограничен на листовых объектах и ​​почти одинаково на всех типах узлов.

1

Подумайте о шаблоне стратегии (http://en.wikipedia.org/wiki/Strategy_pattern). Причина:

  1. Отделить данные и данные от операции.
  2. вы можете изменить алгоритм («count # of children», «find by identifier») во время выполнения.

Я думаю, это что-то вроде этого:

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject> 
extends DatabaseObject { 

    protected List<ChildType> children; 

    private DataOperator dataOperator; 

    public Object find(){ 
     return dataOperator.find(children); 
    } 

} 

public interface DataOperator{ 
    public <ChildType extends DatabaseObject> find(List<ChildType> childList); 
} 

public Class GeneralDataOperator extends DataOperator{ 
    public <ChildType> find(List<ChildType> childList){ 
     //implements find; 
    } 
} 

Затем вы можете использовать инъекции зависимостей.

+0

Я мало знаю об инъекции зависимостей ... как это применимо здесь, пожалуйста? – Robottinosino

0

Композитный шаблон с предложениями (Каркасные Реализации) от Пункт 18: Предпочитают Интерфейсы для абстрактных классов из Эффективное Java 2nd Edition.

  • Определить iterface (EntityCollection) с методами подсчет(), находка(), вид(), удалить() т.д.
  • Абстрактный класс DatabaseContainerObject реализует EntityCollection интерфейс
  • Schema, Таблица, CompositeIndex классы, простирающиеся DatabaseContainerObject и реализации интерфейс EntityCollection. Здесь схемы, Таблица, CompositeIndex являются * Компонент * s в Composite Pattern

Преимуществом является то, будущие классы могут либо продлить DatabaseContainerObject или реализовать EntityCollection

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