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
Kategória:Programtervezési minták