Я нашел это описание :
Внешние и внутренние итераторы.
Внешние Итераторы - когда итерацией управляет объект коллекции, мы говорим, что у нас есть внешний Итератор.
В таких языках, как .net или java, очень легко создавать внешние итераторы. В нашей классической реализации реализован внешний итератор. В следующем примере используется внешний итератор:
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext(); ) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext() ){
System.out.println(name.next() );
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
Внутренние итераторы - когда итератор управляет им, у нас есть внутренний итератор
С другой стороны, реализовать и использовать внутренние итераторы действительно сложно. Когда используется внутренний итератор, это означает, что выполняемый код делегируется агрегатному объекту. Например, для языков, которые поддерживают это, легко вызывать внутренние итераторы:
collection do: [:each | each doSomething] (Smalltalk)
Основная идея - передать код, который будет выполнен, в коллекцию. Затем коллекция будет внутренне вызывать метод doSomething для каждого из компонентов. В C ++ можно отправлять метод doMethod в качестве указателя. В C #, .NET или VB.NET возможно отправить метод в качестве делегата. В Java должен использоваться шаблон проектирования Functor
. Основная идея заключается в создании базового интерфейса только с одним методом (doSomething). Затем метод будет реализован в классе, который реализует интерфейс, и класс будет передан в коллекцию для повторения. Для получения более подробной информации см. Шаблон проектирования Functor
.