3. Laboratorio: problema introduttivo
• L’inventario di un magazzino è composto da collezioni di
oggetti che rappresentano i prodotti (InventoryItem).
• Tali oggetti possono essere memorizzati in un database, in
un array, in una linked list, ecc.
• Un’applicazione vuole accedere sequenzialmente agli oggetti
in modo indipendente dalla struttura dati usata per
memorizzarli
Come risolvere il problema?
Come risolvere il problema?
Ingegneria del Software - A.A. 2003/2004
6. Il pattern Iterator (1/6)
• Nome Iterator [GoF95]
• Synopsis Fornisce una modalità di accesso sequenziale ad
una collezione di oggetti indipendentemente
dalla struttura dati usata per memorizzarli.
• Context Cfr. esempio introduttivo
• Forces - Una classe ha bisogno di accedere al contenuto
di una collezione senza risultare dipendente
dalla classe usata per implementare la
collezione
- Una classe ha bisogno di un modo uniforme per
accedere il contenuto di più collezioni
eterogenee.
Ingegneria del Software - A.A. 2003/2004
7. Il pattern Iterator (2/6)
Da Context…
… a Solution
Client
• Solution - Gli “attori” del pattern Iterator sono:
– Collection: Classe che incapsula una collezione di oggetti o valori
– IteratorIF: Interfaccia che definisce i metodi di accesso sequenziale
– Iterator: Classe che implementa IterationIF
– CollectionIF: Interfaccia che obbliga una collezione a creare il proprio
Iterator
Ingegneria del Software - A.A. 2003/2004
8. Il pattern Iterator (3/6)
• Consequences
- E’ possibile accedere agli oggetti senza conoscere la
struttura dati contenente tali oggetti.
- Usando più iteratori è facile gestire diversi
“attraversamenti” contemporanei
- E’ possibile per una classe fornire più iteratori che
attraversano la collezione in modo diverso (su cosa si
basa il metodo getNextItem()?)
Ingegneria del Software - A.A. 2003/2004
9. Il pattern Iterator (4/6)
• Implementation
- Oltre ai metodi già presentati è possibile trovare:
- Test per l’esistenza e la restituzione dell’elemento
precedente
- Posizionamento sul primo o ultimo elemento
- Cardinalità della collezione
-…
- Spesso Iterator è implementato come inner class privata
della Collection associata
- Modificare il contenuto di una collezione durante
l’attraversamento di un client può creare problemi (oggetti
mancanti o duplicati)
Ingegneria del Software - A.A. 2003/2004
10. Il pattern Iterator (5/6)
• Java API usage
java.util.Collection
java.util.Collection java.util.Iterator
java.util.Iterator
java.util.Vector
java.util.Vector Inner class private di:
Inner class private di:
java.util.LinkedList java.util.Vector
java.util.Vector
java.util.LinkedList
java.util.ArrayList java.util.LinkedList
java.util.LinkedList
java.util.ArrayList
… java.util.ArrayList
java.util.ArrayList
…
……
Ingegneria del Software - A.A. 2003/2004
11. Il pattern Iterator (6/6)
• Code example
InventoryIteratorIF
public interface InventoryIteratorIF {
public boolean hasNextInventoryItem() ;
//…
}
InventoryCollection
public class InventoryCollection { //...
public InventoryIteratorIF iterator() {
return new InventoryIterator();
}
InventoryIterator implements InventoryIteratorIF
private class InventoryIterator
{
public boolean hasNextInventoryItem() {
//...
} //… } }
• Related Patterns Adapter, Factory Method, Null Object
Ingegneria del Software - A.A. 2003/2004