Режим итератора, также известный как режим курсора. Определение, приведенное GOF, заключается в том, чтобы предоставить метод доступа к различным элементам в объекте контейнера без обнаружения внутренних деталей объекта.
Образец итератора состоит из следующих ролей:
Роль итератора: роль итератора отвечает за определение интерфейса для доступа к элементам доступа и прохождения.
Роль конкретного итератора: конкретная роль итератора должна реализовать интерфейс итератора и записать текущее местоположение в обходе.
Контейнер: роль контейнера отвечает за предоставление интерфейса для создания конкретной роли итератора.
Бетонный контейнер: конкретная роль контейнера реализует интерфейс для создания конкретной роли итератора. Эта конкретная роль итератора связана со структурой контейнера.
Пример реализации Java
Классовая диаграмма:
Код:
/ ** * Индивидуальный интерфейс сбора, похожий на java.util.collection * для хранения данных * @author Stone * */ public incollection <t> {iiterator <t> iterator (); // вернуть итератор void add (t t); T Get (int index); } / ** * Пользовательский интерфейс итератора аналогичен Java.util.iterator * Данные, используемые для прохождения ICollection класса коллекции * @author Stone * */ public interface iiterator <t> {boolean hasnext (); логический хромовый (); T Next (); T предыдущий (); } / ** * Класс сбора, зависит от Myiterator * @author Stone */ public class mycollection <t> реализует icollection <t> {private t [] arys; private int index = -1; частная емкость = 5; public mycollection () {this.arys = (t []) новый объект [емкость]; } @Override public iiterator <t> iterator () {return new myiterator <t> (this); } @Override public void add (t t) {index ++; if (index == емкость) {емкость *= 2; this.arys = arrays.copyof (arys, емкость); } this.arys [index] = t; } @Override public t get (int index) {return this.arys [index]; }} /** Если есть новая структура хранения, вы можете новую Icolection, соответствующую новому имеретору, чтобы реализовать его обход*/ @suppresswarnings ({"rawtypes", "unchecked"}) Общественный класс {public static void main (string [] args) {icollection <Integer> collection = new MyCollection <Integer> (); добавить (коллекция, 3, 5, 8, 12, 3, 3, 5); for (iiterator <Integer> iterator = collection.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); } System.out.println ("-------------------------"); Icollection collection2 = новый mycollection (); Add (Collection2, «A», «B», «C», 3, 8, 12, 3, 5); for (iiterator iterator = collection2.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); }} static <t> void add (icollection <t> c, t ... a) {for (t i: a) {c.add (i); }}}}Печать:
3 5 8 12 3 3 5 ------------------ ABC 3 8 12 3 5