Sablonul de proiectare Iterator

Descriere

Sablonul iterator ofera un mecanism de parcurgere a unei colectii de obiecte, secvential, fara a expune reprezentarea interna a acestora (modul cum acestea sunt stocate). Sablonul iterator este utilizat in clasele standard java - de exemplu clasele de tip colectie (Collection, Map) pot fi parcurse cu ajutorul iteratorului java.util.Iterator.

Diagrama UML

Exemplu

Varianta 1

//Iterator.java
public interface Iterator {
   public boolean hasNext();
   public Object next();
}
 
//Container.java
public interface Container {
   public Iterator getIterator();
}
 
//NameRepository.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() {      
         return index < names.length;
      }
 
      @Override
      public Object next() {
 
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }		
   }
}
 
//IteratorPatternDemo.java
public class IteratorPatternDemo {
 
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();
 
      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      } 	
   }
}

Varianta 2

In exemplul de mai jos este utilizata clasa java BitSet precum si interfata Iterator din pachetul java.util. Clasa BitSet este utila in manipularea sirurilor de biti.

import java.util.*;
 
class BitSetIterator implements Iterator<Boolean> {
 
    private final BitSet bitset;
    private int index;
 
    public BitSetIterator(BitSet bitset) {
        this.bitset = bitset;
    }
 
    public boolean hasNext() {
        return index < bitset.length();
    }
 
    public Boolean next() {
        if (index >= bitset.length()) {
            throw new NoSuchElementException();
        }
        boolean b = bitset.get(index++);
        return new Boolean(b);
    }
 
    public void remove() {
        throw new UnsupportedOperationException();
    }
}
 
public class TestClientBitSet {
 
    public static void main(String[] args) {
// create BitSet and set some bits
        BitSet bitset = new BitSet();
        bitset.set(1);
        bitset.set(19);
        bitset.set(20);
        bitset.set(47);
        BitSetIterator iter = new BitSetIterator(bitset);
        while (iter.hasNext()) {
            Boolean b = iter.next();
            String tf = (b.booleanValue() ? "T" : "F");
            System.out.print(tf);
        }
        System.out.println();
    }
}

Rezultatul executie codului de mai sus este:

FTFFFFFFFFFFFFFFFFFTTFFFFFFFFFFFFFFFFFFFFFFFFFFT

Varianta 3

In aceasta varianta se exemplifica utilizarea iteratorului din java pentru parcurgerea unei colectii de tip ArrayList.

import java.util.*;
 
class Person{
    String name;
    Person(String name){
        this.name = name;
    }
 
    public String toString(){
        return "Person:"+name;
    }
}
 
public class TestIterator {
 
    public static void main(String[] args) {
        ArrayList<Person> al = new ArrayList<Person>();
        al.add(new Person("Alex"));
        al.add(new Person("Dan"));
        al.add(new Person("Alin"));
        for (Iterator<Person> iter = al.iterator();
                iter.hasNext();) {
            System.out.println(iter.next());
        }
        // sintaxa JEE5 
        for (Person o : al) {
            System.out.println(o);
        }
    }
}