Modo iterador, también conocido como modo cursor. La definición dada por GOF es proporcionar un método para acceder a varios elementos en un objeto contenedor sin exponer los detalles internos del objeto.
El patrón iterador consta de los siguientes roles:
Rol de iterador: El rol iterador es responsable de definir la interfaz para acceder y atravesar elementos.
Rol de iterador concreto: el rol iterador específico debe implementar la interfaz iteradora y registrar la ubicación actual en el recorrido.
Contenedor: el rol de contenedor es responsable de proporcionar una interfaz para crear un rol de iterador específico.
Contenedor de concreto: el rol de contenedor específico implementa la interfaz para crear un papel iterador específico. Este rol iterador específico está relacionado con la estructura del contenedor.
Ejemplo de implementación de Java
Diagrama de clases:
Código:
/ ** * Interfaz de colección personalizada, similar a java.util.collection * para almacenamiento de datos * @author Stone * */ public interfaz ICollection <T> {iiterator <T> iterator (); // devuelve el iterador void add (t t); T get (int index); } / ** * La interfaz de iterador personalizado es similar a Java.util.iterator * Datos utilizados para atravesar la clase de recopilación ICollection * @Author Stone * */ Public Interface Iiterator <T> {boolean HasNext (); Boolean Hasprevious (); T Next (); T anterior (); } / ** * Clase de colección, depende de Myiterator * @author Stone */ public class MyCollection <T> implementa ICollection <T> {private t [] arys; Private int index = -1; Capacidad de int -intivate = 5; public myCollection () {this.arys = (t []) nuevo objeto [capacidad]; } @Override public IIterator <T> iterator () {return new MyIterator <T> (this); } @Override public void add (t t) {index ++; if (index == capacidad) {capacidad *= 2; this.arys = arrays.copyOf (arys, capacidad); } this.arys [index] = t; } @Override public t get (int index) {return this.arys [index]; }} /** Si hay una nueva estructura de almacenamiento, puede una nueva iCollection, correspondiente a un nuevo iiterator para implementar su transbordador*/ @supplesswarnings ({"RawTypes", "no comprobado"}) prueba pública de clase {public static void main (string [] string) {iCollection <Diseger> recolección = nueva mycollection <deger> ();); agregar (colección, 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 = new MyCollection (); agregar (colección2, "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) {para (t i: a) {c.add (i); }}}}Imprimir:
3 5 8 12 3 3 5 ------------------ ABC 3 8 12 3 5