Какой шаблон проектирования использовать для реализации «расширителей данных»? - PullRequest
1 голос
/ 11 ноября 2010

Вот что я пытаюсь сделать:

public class DataBuilder {
  public DataBlock create() {
    DataBlock block = new DataBlock();
    for (Extender extender : this.getExtenders()) {
      extender.extend(block);
    }
  }
}

Некоторое время спустя:

DataBlock block = new DataBuilder().create();

Каждый extender добавляет определенную информацию к block. DataBuilder не хочет ничего знать о внутренней структуре этих расширителей. В настоящее время мой метод getExtenders() находит все подклассы Extender (в classpath) и возвращает их экземпляры.

Работает нормально, но мне не нравится, как это выглядит, с точки зрения дизайна. Может быть, я мог бы / должен использовать какой-то шаблон, чтобы сделать эту конструкцию более гибкой?

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Продолжая ответ Адриана, я кратко объясню, как это будет работать:

Предположим, что DataBlock происходит от интерфейса с именем IDataBlock. Каждый расширитель наследуется от DataBlockDecorator, который наследуется от IDataBlock, который выполняет некоторую операцию с DataBlock (принимая IDataBlock в конструкторе). Это позволяет вам делать что-то вроде.

IDataBlock block = new DataBlock();
for (DataBlockDecorator extender : this.getExtenders()) {
  extender.extend(block);
  block = extender;
}

Однако, это на самом деле не добавляет больше гибкости, чем раньше. В этом отношении ваше оригинальное решение уже настолько гибко, насколько оно возможно.

0 голосов
/ 11 ноября 2010

Шаблон декоратора

interface BlockDeckorator
{
    extend(DataBlock block);
}

class FooBlockDecoratorImpl implements BlockDecorator
{
    private BlockDeckorator blockDecorator;

    public FooBlockDecoratorImpl(BlockDecorator decorator)
    {
         this.blockDecorator = decorator;
    }

    public void extend(DataBlock block)
    {
         blockDecorator(block);
         // Add my own code to do Foo afterwards (or before)
    }
}
0 голосов
/ 11 ноября 2010

Посмотрите на шаблон Декоратор .

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