Il pattern Iterator

Iterare con Iterator in un insieme di oggetti

Il pattern Iterator viene utilizzando quando si ha la necessità di voler accedere a tutti gli elementi di una generica collezione senza esporne la struttura interna. Inoltre, gli utilizzatori devono poter accedere agli elementi del contenitore contemporaneamente.

L’idea alla base del pattern Iterator è quella di avere un determinato oggetto, detto contenitore, che contiene altri oggetti al suo interno. A questo contenitore viene associato un nuovo oggetto, chiamato iteratore, che rappresenta un indice per scorrere l’interno del contenitore. Ogni client avrà un proprio indice iteratore per scorrere il contenitore. Il pattern è così presentato:

  • Nome: Iterator
  • Contesto:
    1. Un oggetto (aggregato) contiene altri oggetti (elementi);
    2. I client devono poter accedere a tutti gli elementi uno alla volta;
    3. L’aggregato non dee esporre la sua struttura interna;
    4. Più client devono poter accedere contemporaneamente.
  • Soluzione:
    1. Definire una classe iteratore che recupera un elemento per volta;
    2. L’aggregato ha un metodo che restituisce un iteratore.

Il pattern Iterator – Lezione 18 di Java Avanzato

Il client può ignorare sia la struttura dati che i dettagli dell’iteratore utilizzando i metodi dell’interfaccia

La soluzione che viene proposta dal pattern Iterator è di utilizzare due interfacce:

  1. La prima, quella Iterator che rappresenta un iteratore, ovvero l’indice all’interno del contenitore, che consente di verificare se ci sono elementi da analizzare, per accedere all’elemento corrente e passare a quello successivo;
  2. La seconda interfaccia è chiamate Aggregate e rappresenta il contenitore con gli elementi.

L’interfaccia Iterator contiene un metodo next che restituisce il prossimo elemento del contenitore, e contemporaneamente fa avanzare l’indice di una posizione. Un metodo isDone che restituisce vero se tutti gli elementi del contenitore sono stati visitati. Ogni chiamata a isDone non modifica la posizione corrente dell’indice. Aggregate ha un metodo chiamato createIterator che crea e restituisce un nuovo iteratore.

L’interfaccia Iterator e Aggregate dovranno essere implementate da classi concrete che dovranno implementare i metodi delle due interfacce. Tuttavia, il client potrebbe non conoscere queste classi concrete e limitarsi soltanto ad utilizzare le interfacce.

I metodi di Iterator in Java: next, hasNext e remove

La libreria standard Java (da Java 1.4) mette a disposizione un’interfaccia Iterator leggermente differente.

In questa versione del pattern, l’interfaccia Iterator rappsenta sempre un iteratore, ma i suoi metodi cambiano leggermente… il metodo next resta invariato, restituisce il prossimo elemento del contenitore e contemporaneamente fa avanzare l’indice di una posizione. Se viene chiamato quando non ci sono più elementi dovrebbe lanciare l’eccezione NoSuchElementException.
Il metodo hasNext rappresenta il vecchio isDone del pattern ma il suo significato è l’opposto: restituisce vero se c’è un almeno un altro elemento del contenitore che deve ancora essere visitato.
In Java, Iterator inserisce anche un nuovo metodo non previsto dal pattern. Si tratta del metodo remove che elimina dal contenitore l’ultimo elemento restituito da next; remove può essere chiamato una sola volta dopo una chiamata a next.
In realtà l’operazione remove è facoltativa, gli iteratori concreti sono liberi di non supportarla, ed in tal caso devono lanciare l’eccezione UnsupportedOperationException (non verificata).

L’interfaccia Iterable rappresenta Aggregate del pattern originale. Il suo metodo iterator si comporta come il vecchio createIterator e restituisce un nuovo iteratore.

Le interfacce Iterable e Iterator sono contenute nel package java.util. Dalla versione 1.5 l’iterator è stato aggiornato alla versione parametrica (ne discuteremo in seguito alla lezione 23).

Un esempio di classe che utilizza il pattern Iterator è la classe LinkedList.

Un buon riferimento con tutti i metodi della classe Iterator è la pagina ufficiale di Oracle.

Ecco l’indice della pagina con la lista completa di tutti i design pattern fate riferimento a questa pagina.

Pubblicato in Design Pattern, Guide, Java, Programmazione Taggato con: , , , , , , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*