Iterator programtervezési minta
Az objektumorientált programozásban az iterátor olyan tervezési minta, melyet arra használunk, hogy bejárjunk egy containert és elérjük annak elemeit. Az Iterátor minta szétválogatja a container algoritmusait; egyes esetekben viszont ezek az algoritmusok container-specifikusak és így nem nem lehet őket függetleníteni.

Például, egy képzeletbeli SearchForElement algoritmust általában végrehajthatunk egy meghatározott típusú iterátorral, ahelyett, hogy container-specifikus algoritmusként implementálnánk. ezáltal a SearchForElement bármely container által használható, mely támogatja a kívánt típusú iterátort.

Definíció
Az Iterátor Aggregator minta lényege, hogy segítségével szekvenciálisan érhetjük el egy aggregált objektum elemeit, a mögöttes megvalósítás megismerése nélkül.

Nyelv specifikus végrehajtás
Néhány nyelv standardizálja a szintaxist. A C++ és a Python figyelemre méltó példa lehet.

C++
A C++ a pointerek szemantikájával valósítja meg az Iterátorokat. A C++-ban egy osztály megtölthetünk pointer műveletekkel, ezáltal az Iterátort implementálhatjuk többé-kevésbé pointer mintára, mely rendelkezik, feloldással, növeléssel és csökkentéssel. Ennek előnye, hogy a C++ algoritmusokat, mint például a std::sort azonnal alkalmazhatóak korábbi memória pufferekre és hogy ehhez nem kell új szintaxist megtanulni. Ugyanakkor szükség van egy vég-Iterátorra az egyenlőség teszteléséhez, ahelyett hogy az Iterátor felismerné, hogy elért a művelet végére. Úgy mondjuk, hogy a C++ nyelvben az Iterátor modellezi az Iterátor koncepcióját.

Java
A Java-ban van Iterátor interfész. A Java 5 óta az olyan objektumok, melyek implementálják az Iterable interfészt, mely egyetlen metódus segítségével visszaad egy Iterátort, bejárhatók egy továbbfejlesztett for loop szintaxis segítségével. A Java collection frameworkben található Collection interfész kiterjed az Iterátorra is.

Python
A Python a nyelv részeként előre meghatározza az Iterátorok szintaxisát, így a nyelv kulcsszavai, mint például a for, működhetnek a Python által használt szekvenciákkal. A szekvenciának van egy __iter__() metódusa, mely visszaad egy Iterátor objektumot. Az "Iterátor protokoll"-hoz tartozik a next(), mely a következő elemet adja vissza, vagy egy stopIteration kivétel, amikor elért a szekvencia végére. Az Iterátorok rendelkeznek továbbá egy __iter__() metódussal, melynek segítségével önmagukat adják vissza, hogy újra iterálhatóak legyenek, például a for loop használatával. A generátorok a 2.2. óta elérhetőek.

A Python 3-ban a next()-et átnevezték __next__()-re.

PHP
A PHP az Iterátor Interfészen keresztül alkalmazza iterátor mintát, ami a standard csomag része. Azok az objektumok, melyek implementálják ezt az interfészt bejárhatók a foreach nyelvi konstrukcióval.

Példa mintákra a PHP-ben

interface IIterator {
    /*
     * @param: void
     * @return:Boolean
     */
    public function hasNext();
 
    /*
     * @param: void
     * @return: String
     */
    public function next();
}
 
interface IContainer {
    /*
     * @param: void
     * @return: IInterator
     */
    public function createIterator();
}
 
class BooksCollection implements IContainer {
    private $a_titles = array();
 
    /*
     * @param: void
     * @return: IIterator
     */
    public function createIterator()
    {
        return new BookIterator($this);
    }
 
    /*
     * @param: string
     * @return: void
     */
    public function setTitle($string)
    {
        $this->a_titles[] = $string;
    }
 
    /*
     * @param: void
     * @return: Array
     */
    public function getTitles(){
        return $this->a_titles;
    }
}
 
class BookIterator implements IIterator {
    private $i_position = 0;
    private $booksCollection;
 
    function __construct(BooksCollection $booksCollection)
    {
        $this->booksCollection = $booksCollection;
    }
 
    /*
     * @param: void
     * @return: Boolean
     */
    public function hasNext()
    {
        if ($this->i_position < count($this->booksCollection->getTitles())) {
            return true;
        }
        return false;
    }
 
    /*
     * @param: void
     * @return: String
     */
    public function next()
    {
        $m_titles = $this->booksCollection->getTitles();
 
        if ($this->hasNext()) {
            return $m_titles[$this->i_position++];
        } else {
            return null;
        }
    }
}
 
class Tester {
    static function Main() {
        $booksCollection = new BooksCollection();
 
        $booksCollection->setTitle("Design Patterns");
        $booksCollection->setTitle("1");
        $booksCollection->setTitle("2");
        $booksCollection->setTitle("3");
 
        $iterator = $booksCollection->createIterator();
        while ($iterator->hasNext()) {
            echo $iterator->next() . '<br />';
        }
    }
}
 
Tester::Main();

Kapcsolódó szócikkek 
 Programtervezési minta
 Összetétel programtervezési minta
 Megfigyelő programtervezési minta
 Konténer (adatstruktúra)

Jegyzetek

További idegen nyelvű irodalom

 Object iteration in PHP
 Iterator Pattern in C#
 Iterator pattern in UML and in LePUS3 (a formal modelling language)
 SourceMaking tutorial
 Design Patterns implementation examples tutorial
 Iterator Pattern

Fordítás

Programtervezési minták