Iterator
Návrhový vzor Iterator zajišťuje možnost procházení prvků bez znalosti jejich implementace. Lze implementovat pomocí pole nebo jiných datových struktur. Pomocí datové struktury ArrayList je implementace daleko snazší.
Obsah |
Implicitní iterátory [editovat]
Některé objektově orientované jazyky jako Perl, Python, C#, Ruby a pozdější verze Javy a Delphi poskytují vlastní způsob jak iterovat elementy obsahující objekty nebo primitivní datové typy bez explicitního vytvoření iterátoru. V tomto případě iterátor není přístupný pro ostatní kód ale lze k němu přistoupit v dané posloupnosti elementů.
Implicitní iterátory jsou často označovány jako "foreach" a tento styl procházení elementů se také někdy nazývá "vnitřní iterace". Takto vypadá implicitní iterace v programovacím jazyce Python:
for value in iterable: print value
Jiný případ je v jazyce Ruby, tam si může objekt vytvořit kolekci sám sobě:
iterable.each do |value| puts value end
Implementace iteratoru v jazyce Java [editovat]
V ukázce jsou osoby a jejich kolekce. Kolekce obsahuje vnitřní třídu s názvem PersonIterator, pomocí které ji můžeme celou procházet. Třída PersonIterator implementuje rozhraní Iterator, které obsahuje metody hasNext();(zjistí jestli je v kolekci další osoba) a getNext();(získá další osobu v kolekci). V této ukázce je kolekce implementována pomocí datové struktury ArrayList.
import java.util.ArrayList; public class Main { public static void main(String[] args) { //použití Person per1 = new Person("Jakub", 20); Person per2 = new Person("Lukáš", 21); Person per3 = new Person("Filip", 30); Person per4 = new Person("Honza", 35); PersonCollection perCol = new PersonCollection(); perCol.add(per1); perCol.add(per2); perCol.add(per3); perCol.add(per4); Iterator myIt = perCol.Iterator(); while (myIt.hasNext()) { Person p = myIt.getNext(); System.out.println("Jméno: " + p.getName()); System.out.println("Věk: " + p.getAge()); System.out.println("---------------------------------"); } } } class Person { private String name; private int age; Person(String _name, int _age) { this.name = _name; this.age = _age; } public String getName() { return this.name; } public int getAge() { return this.age; } } interface Iterator { public boolean hasNext(); public Person getNext(); } class PersonCollection { @SuppressWarnings("unchecked") private ArrayList<Person> persons = new ArrayList(); public PersonIterator Iterator() { return new PersonIterator(); } public void add(Person per) { this.persons.add(per); } private class PersonIterator implements Iterator { private int current = 0; public boolean hasNext() { if (current == persons.size()) { return false; } else { return true; } } public Person getNext() { return persons.get(current++); } } }