Структура рисунка итератора:
Итеративный подпрокат может получить доступ к агрегированному элементу, последовательно, не подвергая агрегированного внутреннего представления.
Итеративы можно разделить на внешние итеративы и внутренние итеративы .
Внешний итератор: подходит для агрегации белой коробки (агрегация белой коробки - это предоставление внешнему миру агрегацией, которая обращается к его внутреннему интерфейсу элемента). Поскольку итеративная логика обеспечивается самим объектом агрегации, такой внешний итераторный суб-подрол часто только поддерживает положение курсора итерации. Следовательно, специфический итеративный подзадлен является внешним классом, и его конструктор принимает определенный объект агрегата, так что он может вызвать итеративную логику агрегатного объекта.
Внутренний итератор: подходит для агрегации черного ящика (агрегация черного ящика не обеспечивает интерфейс снаружи, чтобы пройти свои собственные объекты элемента). Поскольку элементы объектов, собранных черным ящиком, могут быть доступны только агрегированными внутренними элементами, внутренний итератор может быть только подклассом элемента внутри совокупного.
Простая демонстрация:
Пакет Test.edu.inter; Публичный интерфейс iteratorObj { / *** Перейти к первому элементу* / public void First (); / *** Перейти к следующему элементу*/ public boolean hasnextitem (); / *** Возвращает текущий элемент*/ public ocumentItem (); } package test.edu.inter; Набор данных общего интерфейса {public iteratorObj getIterator (); } package test.edu.inter; открытый класс итератор1 реализует iteratorObj {private dataObj set; частный размер Int; private int index = 0; public iterator1 (dataObj set) {this.set = set; this.size = set.getSize (); } @Override public void first () {// todo автоматически сгенерированный метод stub this.index = 0; } @Override public boolean hasNextItem () {if (index <size) {return true; } вернуть false; } @Override public объект currentItem () {object ob = set.getItem (index); if (index <size) {index ++; } вернуть OB; }} package test.edu.inter; открытый класс DataObj реализует набор данных {private Object [] objarray = null; / *** Входящий агрегатный объект*/ public DataObj (Object [] objarray) {this.objarray = objarray; } @Override public iteratorObj getiterator () {return new iterator1 (this); } public Object getItem (int index) {return objarray [index]; } public int getSize () {return objarray.length; }} package test.edu.inter; public class client { / ** * @param args * / public static void main (string [] args) {// todo Автогенерированный метод string string [] str = {"12312", "dasda", "dasd", "12d", "aSd"}; DataObj ao = new DataObj (str); IteratorObj io = ao.getiterator (); while (io.hasnextitem ()) {System.out.println (io.currentitem ()); }}} Результаты работы:
12312 DASDA DASD 12D ASD
Расширение контента: приложения в агрегации Java
Метод фабрики итератор () представлен в интерфейсе java.util.collection, чтобы вернуть объект типа итератор. Подтип интерфейса коллекции, внутренний класс членов ITR реализует интерфейс итератора. Таким образом, ITR является внутренним итеративным подклассом, но AbstractList также предоставляет свой собственный метод обхода, поэтому это не агрегация черного ящика, а агрегация белой коробки. Код заключается в следующем:
Import java.util.iterator; Общедоступный интерфейс itr Extends iterator {// Индикатор, используемый при вызове метода следующего () снова int cursor = 0; // индикатор, используемый в последнем вызове lastret = -1; int weddcount = modcount; public boolean hasnext () {return cursor! = size (); } public Object Next () {try {Object Next = get (cursor); checkforComodification (); lastret = cursor ++; вернуться следующим; } catch (indexoutOfBoundSexception e) {checkforComodification (); бросить новое noshelementexception (); }} // Удалить последний обходной элемент, метод remove () может удалить только последнее обходное элемент public void remoad () {if (lastret ==-1) бросить новый allosalStateException (); checkforComodification (); try {AbstractList.This.remove (lastret); if (lastret <cursor) cursor--; lastret = -1; weddcount = modcount; } catch (indexoutOfBoundSexception e) {бросить новый concurrentModificationException (); }} public void checkforComodification () {if (modcount! = wedermodcount) бросить новый complorentmodificationexception (); }} Переменные и методы, такие как ModCount, Get (курсор), принадлежат классу AbstractList, и ITR можно использовать напрямую. Метод CheckforComodification () проверит, был ли агрегированный контент прямо только что изменен внешним миром (не измененным с помощью метода remove (), предоставленного итератором). Если собранное содержание обойдется итерационным суб-объектом и непосредственно изменяет новый год после итерационного подраздела, этот метод немедленно вызовет исключение.
Кроме того: класс AbstractList также предоставляет метод ListIterator (), возвращая экземпляр Class Listitr, который реализует интерфейс ListIterator. Интерфейс Listicerator реализует перспективную итерацию и обратную итерацию, а также предоставляет метод безопасного изменения содержания столбца во время процесса итерации.
Разница между подсчетом и итератором: (1) перечисление не имеет метода удаления (2) перечисление реализовано как неназванный класс в методе Element () в векторе. Он не платит за неудачный быстрый, то есть во время итерационного процесса агрегированный объект неожиданно изменяется внешним миром, и этот процесс итерации немедленно поймает любые исключения.
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.