Padrão de Projeto Iterator
Raphael do Vale
© LES/PUC-Rio
Agenda
• Motivação
• Aplicabilidade
• Estrutura
• Participantes
• Conseqüências
• Implementação
• Exemplo
© LES/PUC-Rio
Iterator
• Motivação
– É preciso ter um meio de acessar os elementos de um objeto
(como uma lista) sem expor a sua estrutura interna;
– Permitir diversas maneiras de se percorrer uma lista sem
precisar criar um código especifico para isso;
– Poder ter mais de uma iteração concorrente na mesma
listagem.
Iterator
• Motivação
Iterator
• Motivação
– Ao iterar por uma lista, não saberemos se ela é seqüencial ou
hash.
Iterator
• Aplicabilidade
– Iterators são utilizados para
• Acessar o conteúdo de objetos agregados sem que para isso seja
necessário conhecer a sua estrutura interna;
• Acessar o conteúdo desses objetos de diversas formas. Inclusive
podendo filtrar por determinados tipos de dados;
• Para fornecer uma única interface de iteração que percorra
diferentes objetos agregados (iteração polimórfica).
Iterator
• Estrutura
A lista é a
responsável por
instanciar o iterator.
Só possui métodos
de iteração. Sem
inclusão de itens ou
operação de voltar.
return new ConcreteIterator(this);
Iterator
• Participantes
– InterfaceIterator
• Define a interface para acessar e percorrer elementos
– ConcreteIterator
O• InterfaceAgregado
não
define métodos para
Implementa a interface
InterfaceIterator
inclusão,
operação
• Mantémremoção
o controle ou
da qualquer
posição corrente
no percurso do
comum
à uma lista. Ele só define o método
ConcreteAgregado
para a criação de um Iterator.
– InterfaceAgregado
• Define uma interface de criação do Iterator
– ConcreteAgregado
• Implementa a interface de criação do AbstractIterator para
retornar uma instância do ConcreteIterator apropriado
Iterator
• Conseqüências
– Suporta variações no percurso de um Agregado.
• Caminhamento em árvores binárias.
– Simplificação da interface do agregado.
• Criação da interface do Iterator elimina métodos responsáveis
pelo percurso do Agregado.
– Podem existir múltiplos percursos em um Agregado.
• Cada Iterator pode possuir um estado próprio e mantém o
controle do percurso. Para cada Iterator instanciado, haverá um
percurso em andamento.
Iterator
public class ListaDeVetor implements AbstractAgregado {
private Vector
vetor;
private int tamanho = 0;
public class IteratorVetor implements AbstractIterator {
public ListaDeVetor( int tamanhoInicial ) {
private int indiceAtual = 0;
this.vetor = new Vector( tamanhoInicial
private);Iterator.ListaDeVetor lista;
• Implementação
public IteratorVetor( ListaDeVetor lista )
{
this.lista = lista;
}
}
public Object itemAtual() {
public AbstractIterator criaIterator()
{
return lista.retornaValorIndice(
return new IteratorVetor(
this ); );
indiceAtual
public interface
AbstractIterator {
}
}
public
Object
retornaValorIndice( int indice ) public
{
Object
itemAtual();
boolean possuiProximo() {
indice < this.tamanho )
booleanif(
possuiProximo();
if( indiceAtual >= lista.getTamanho()
return
vetor.get(
indice
);
)
void proximo();
return null;
return false;
void primeiro();
}
return true;
}
public void adiciona( Object valor ) {
}
this.vetor.add( valor );
public void proximo() {
this.tamanho++;
if( this.possuiProximo() )
}
this.indiceAtual++;
public void remove( int indice ) {
}
this.vetor.remove( indice );
public void primeiro() {
}
this.indiceAtual = 0;
public int getTamanho() {
}
return this.tamanho;
}
}
}
public interface
AbstractAgregado {
public
ListaDeVetor()
AbstractIterator {criaIterator();
this.vetor = new Vector();
}
}
Iterator
• Exemplo
– Framework para persistência de dados
• O sistema cliente não precisa saber como estão armazenados os
dados que ele está percorrendo;
• XML, Tabelas de dados ou Webservices, não importa onde estão
os dados, eles serão percorridos da mesma forma;
• O framework pode armazenar o resultado de uma consulta em
um vetor antes de liberar o iterator ou pode apenas marcar o
cursor no primeiro elemento. Para cada requisição de próximo, o
cursor do banco de dados avança para o primeiro.
– Isso tudo sem conhecimento do cliente!
• Exemplo: Hybernate
Obrigado 
© LES/PUC-Rio
Download

Slides - (LES) da PUC-Rio