Il design Pattern Iterator viene molto comunemente usato in ambito di programmazione Java e .Net. Questo pattern viene utilizzato per ottenere una modalità di accesso agli oggetti di un repository in modo sequenziale senza che sia necessario conoscerne la rappresentazione sottostante.
Per le sue modalità di utilizzo, il pattern rientra nella categoria Comportamentali.
DIAGRAMMA UML
IMPLEMENTAZIONE ITERATOR
Creeremo un’interfaccia Iterator che narra il metodo di navigazione e un’interfaccia Container che ritrasforma l’iteratore. Dopo di chè creeremo le classi concrete che implementano le due interfacce.
Step 1: Creiamo le due interfacce
Container.java
public interface Container {
public Iterator getIterator();
}
Iterator.java
public interface Iterator {
public boolean hasNext();
public Object next();
}
Step 2: Creiamo la classe Repository che implementa l’interfaccia Container
Attenzione! La classe possiede all’interno un’altra classe il cui scopo è quello di implementare Iterator.java
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
Step 3: Creiamo il main
public class Main {
public static void main(String[] args) {
Repository repository = new Repository();
System.out.println("[MAIN]: Recupero nomi in Repository"+"\n");
for(Iterator iterator = repository.getIterator(); iterator.hasNext();){
String name = (String)iterator.next();
System.out.println("[MAIN]: Nome -> " + name);
}
}
}
Step 4: Output
[MAIN]: Recupero nomi in Repository
[REPOSITORY]: hasNext()::true
[REPOSITORY]: hasNext()::true
[REPOSITORY]: next()::Roberto
[MAIN]: Nome -> Roberto
[REPOSITORY]: hasNext()::true
[REPOSITORY]: hasNext()::true
[REPOSITORY]: next()::Giovanni
[MAIN]: Nome -> Giovanni
[REPOSITORY]: hasNext()::true
[REPOSITORY]: hasNext()::true
[REPOSITORY]: next()::Giulia
[MAIN]: Nome -> Giulia
[REPOSITORY]: hasNext()::true
[REPOSITORY]: hasNext()::true
[REPOSITORY]: next()::Andrea
[MAIN]: Nome -> Andrea
[REPOSITORY]: hasNext()::false
0 Comments