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); } } }