2015-03-08 4 views
0

Рассмотрите объект, который извлекает значения объекта из источника на основе «pull» до тех пор, пока не встретится специальное значение (например, null).Шаблон проектирования для последующего экстрактора значений объектов

В Java, то API может быть что-то вроде

public interface ValueExtractor<T> { 
    public T extractNext(); 
    } 

операционально, это Iterator, но он имеет только (вроде) «следующего()» метод и не является Reader, так как он не чтение из исходного байта. Он также напоминает курсор базы данных в том смысле, что он «прокручивает» все значения данных (записи), пока они не исчерпаны.

Есть ли шаблон дизайна, отличный от «итератора» для этого прецедента?

Что было бы лучшим именем для вызова такого простого объекта?

+0

Почему не итератор? Похоже на меня. – dnault

+0

В терминах 'Java' он не имеет метода' hasNext() 'или' remove() '. Это «частичный» итератор. :-) – PNS

+1

remove() - необязательная операция. Просто выберите UnsupportedOperationException(). Для hasNext() вы можете извлечь следующее значение и буферизировать его, чтобы последующий вызов next() возвращал буферное значение. – dnault

ответ

2

Это Iterator. Просто потому, что он не соответствует интерфейсу java.util.Iterator, это не значит, что он не соответствует шаблону проектирования итератора.

Единственное различие заключается в том, что у вас есть только один метод, который объединяет выборку следующего элемента и проверку наличия следующего объекта для извлечения. Я предполагаю, что вы вернетесь null, если элементов больше нет.

Если у вас есть отдельные методы hasNext() и fetchNext(), или если вы объедините их в один метод, который возвращает null, это решение API и не изменяет тот факт, что вы следуете шаблону проектирования итератора.

Однако, с точки зрения соглашения об именах API, если вы решили объединить все методы Итератора в один метод fetchNext(), вы не должны иметь слово «Итератор» в своем имени класса, поскольку это может вызвать путаницу из пользователей вашего кода, который ваш класс реализует интерфейс java.util.Iterator.

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

EDIT Так как вы говорите в своем OP:

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

Вы, наверное, можно назвать это что-то вроде ScrollableRecords

+0

Хорошие очки и +1. Согласен. Но что вы называете такими классами? :-) – PNS

+0

@PNS добавлено предложение имени – dkatzel

1

У Guava есть класс AbstractIterator, который вы можете использовать, чтобы заставить ValueExtractor вести себя как итератор.

+0

Несомненно, но это не то, что мне нужно. Пожалуйста, проверьте комментарии. Благодарю. :-) – PNS

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

  • Нет связанных вопросов^_^