Mode itérateur, également connu sous le nom de mode curseur. La définition donnée par GOF est de fournir une méthode pour accéder à divers éléments dans un objet de conteneur sans exposer les détails internes de l'objet.
Le modèle d'itérateur se compose des rôles suivants:
Rôle de l'itérateur: Le rôle de l'itérateur est responsable de la définition de l'interface pour accéder et traverser les éléments.
Rôle itérateur du béton: le rôle d'itérateur spécifique doit implémenter l'interface itérateur et enregistrer l'emplacement actuel dans la traversée.
Conteneur: le rôle de conteneur est responsable de fournir une interface pour créer un rôle d'itérateur spécifique.
Conteneur en béton: le rôle de conteneur spécifique implémente l'interface pour créer un rôle d'itérateur spécifique. Ce rôle d'itérateur spécifique est lié à la structure du conteneur.
Exemple d'implémentation Java
Diagramme de classe:
Code:
/ ** * Interface de collecte personnalisée, similaire à java.util.collection * pour le stockage de données * @Author Stone * * / interface publique Icollection <T> {iiterator <T> iterator (); // Renvoie l'itérateur void add (t t); T get (int index); } / ** * L'interface Iterator personnalisée est similaire à java.util.iterator * Données utilisées pour traverser la classe de collecte ICOllection * @Author Stone * * / interface publique iiterator <T> {Boolean Hasnext (); Boolean Hasprevious (); T suivant (); T Précédent (); } / ** * Classe de collection, dépend de Myiterator * @author Stone * / public class MyCollection <T> implémente iCollection <T> {private t [] arys; Index int privé = -1; Capacité int privée = 5; public myCollection () {this.arys = (t []) nouvel objet [capacité]; } @Override public iiterator <T> iterator () {return new Myiterator <T> (this); } @Override public void add (t t) {index ++; if (index == Capacité) {Capacité * = 2; this.arys = arrays.copyof (Arys, capacité); } this.arys [index] = t; } @Override public t Get (int index) {return this.arys [index]; }} / * * S'il existe une nouvelle structure de stockage, vous pouvez New Icollection, correspondant à un nouvel iiterator pour implémenter sa traversée * / @SuppressWarnings ({"RawTypes", "Unchecked"}) Public Class Test {public static void main (String [] args) {icollection <integer> collection = new myCollection <Integer> (); Ajouter (collection, 3, 5, 8, 12, 3, 3, 5); for (iiterator <nteger> iterator = collection.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); } System.out.println ("--------------------------"); Icollection Collection2 = new MyCollection (); ajouter (collection2, "a", "b", "c", 3, 8, 12, 3, 5); pour (iiterator iterator = collection2.iterator (); iterator.hasnext ();) {System.out.println (iterator.next ()); }} statique <T> void add (icollection <T> c, t ... a) {for (t i: a) {c.add (i); }}}}Imprimer:
3 5 8 12 3 3 5 ------------------ ABC 3 8 12 3 5