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.

iterator

Per le sue modalità di utilizzo, il pattern rientra nella categoria Comportamentali.

 

DIAGRAMMA UML

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

 

LINK UTILI