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
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ó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 a2. óta elérhetőek . A Pythonban 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 = 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