Na programação orientada a objetos um iterador é um objeto que possibilita o programador a examinar um objeto que contem outros objetos (container).
As semânticas de acesso dos iteradores são fixas e você pode implementar diversos tipos de iteradores de forma desacoplada a partir de uma interface.
Imagine um iterador como um cursor de uma base de dados onde os elementos são acessados sequencialmente (cursor).
Os arquivos utilizados podem ser encontrados em:
https://github.com/wlepinski/as3-patterns/tree/master/Iterator
Basicamente a interface de um iterador pode ser definida como:
[cc lang=”actionscript”]
public interface IIterator
{
function first ():void;
function next ():void;
function isDone ():Boolean;
function currentItem ():*;
function hasNext():Boolean;
}
[/cc]
Com essa interface podemos prover algumas implementações de iteradores para qualquer tipo de objeto que descreva qual o seu iterador, a interface abaixo será utilizada pelos nosso objetos que podem ser iterados.
[cc lang=”actionscript”]
public interface IAbstractList
{
function createIterator ():IIterator;
function count ():int;
function append ( item:Object ):void;
function remove ( item:Object ):void;
}
[/cc]
Vamos criar um iterador (ArrayIterator) que implementa a interface IIterator e recebe como parâmetro no construtor um ArrayList que também vamos implementar a seguir:
Implementação do ArrayIterator:
[cc lang=”actionscript”]
public class ArrayIterator implements IIterator
{
public var index:int = 0;
public var list:ArrayList;
public function ArrayIterator ( list:ArrayList ) {
this.list = list;
}
public function first ():void {
index = 0;
}
public function next ():void {
index++;
}
public function isDone ():Boolean {
return index >= list.count();
}
public function currentItem ():* {
return list.array[ index ];
}
public function hasNext ():Boolean {
return index < list.count();
}
}
[/cc]Implementação do ArrayList:[cc lang="actionscript"]
public class ArrayList implements IAbstractList
{
public var array:ArrayCollection = new ArrayCollection();public function ArrayList (){
}public function createIterator ():IIterator
{
return new ArrayIterator( this );
}public function count ():int
{
return array.length;
}public function append ( item:Object ):void
{
array.addItem( item );
}public function remove ( item:Object ):void
{
array.removeItemAt( array.getItemIndex( item ) );
}
}
[/cc]Podemos utilizar o iterador de duas formas, em um "for" ou em um "while":[cc lang="actionscript"]
var list:IAbstractList;
var iterator:IIterator;// Utilizando o for
list = new ArrayList();
list.append( "Array Item 1" );
list.append( "Array Item 2" );
list.append( "Array Item 3" );iterator = list.createIterator();for ( iterator.first(); !iterator.isDone(); iterator.next() )
{
trace( iterator.currentItem() );
}// Usando while
list = new ArrayList();
list.append( "Array2 Item 1" );
list.append( "Array2 Item 2" );
list.append( "Array2 Item 3" );iterator = list.createIterator();while ( iterator.hasNext() ){
trace( iterator.currentItem() );
iterator.next();
}
[/cc]