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