Modo iterador, também conhecido como modo de cursor. A definição dada pelo GOF é fornecer um método para acessar vários elementos em um objeto de contêiner sem expor os detalhes internos do objeto.
O padrão iterador consiste nas seguintes funções:
Função do iterador: a função do iterador é responsável por definir a interface para acessar e atravessar elementos.
Função do iterador de concreto: a função de iterador específica precisa implementar a interface do iterador e registrar o local atual na Traversal.
Container: A função de contêiner é responsável por fornecer uma interface para criar uma função de iterador específica.
Recipiente de concreto: a função de contêiner específica implementa a interface para criar uma função de iterador específica. Essa função específica do iterador está relacionada à estrutura do contêiner.
Exemplo de implementação de Java
Diagrama de classe:
Código:
/ ** * Interface de coleta personalizada, semelhante a java.util.Collection * para armazenamento de dados * @Author Stone * */ interface pública iCollection <T> {iiterator <t> iterator (); // retorna o iterador void add (t t); T Get (Int Index); } / ** * A interface do iterador personalizada é semelhante ao java.util.iterator * Dados usados para atravessar a classe de coleta icollection * @author stone * */ interface pública iiterator <t> {boolean hasnext (); Boolean Hasprevious (); T próximo (); T anterior (); } / ** * CLOLEGEL CLOECH, depende do myiterator * @Author Stone */ Public Class MyCollection <T> implementa ICOLLECTION <T> {private T [] arys; private int index = -1; Capacidade privada int = 5; public myCollection () {this.arys = (t []) novo objeto [capacidade]; } @Override public iiterator <t> iterator () {return New MyIterator <T> (this); } @Override public void add (t t) {index ++; if (index == Capacidade) {Capacidade *= 2; this.arys = Arrays.copyof (arys, capacidade); } this.arys [index] = t; } @Override public t get (int index) {return this.arys [index]; }} /** Se houver uma nova estrutura de armazenamento, você poderá uma nova iCollection, correspondendo a um novo iiterator para implementar sua travessia*/ @suppresswarnings ({"RawTypes", "UNSLecuD"}) public class Test {public static void main (string [] args) {icollection <Teger> collection = newn add (coleção, 3, 5, 8, 12, 3, 3, 5); para (iiterator <Teger> iterator = collection.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); } System.out.println ("-------------------------"); Coleção ICOLLECTION2 = new MyCollection (); add (coletor2, "a", "b", "c", 3, 8, 12, 3, 5); para (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); }}}}Imprimir:
3 5 8 12 3 3 5 ---------------- ABC 3 8 12 3 5