120 likes | 220 Views
Iterador. ATAI. Introdução. Desejamos criar uma classe para converter estrutura de dados. Exemplo: copiar o conteúdo de uma estrutura linear para uma árvore ou vice-versa Cada estrutura de dados oferece interface e protocolo diferentes para o acesso aos seus elementos
E N D
Iterador ATAI
Introdução • Desejamos criar uma classe para converter estrutura de dados. Exemplo: copiar o conteúdo de uma estrutura linear para uma árvore ou vice-versa • Cada estrutura de dados oferece interface e protocolo diferentes para o acesso aos seus elementos • Algumas estruturas restringem o acesso aos seus elementos, como em Filas e Pilhas • Não é possível caminhar por seus elementos sem modificar as estruturas. (Como aceder o elemento do meio de uma pilha sem retirar os que estão sobre ele?) • Seria necessário ter acesso à implementação para “burlar” o protocolo de acesso • Isso quebra um dos pilares da OO: o encapsulamento
Objectivo • Proporcionar uma forma de aceder sequencialmente os elementos de um objecto agregado (uma colecção) sem expor sua representação interna. • Motivação • Deseja-se isolar o uso de uma estrutura de dados da sua representação interna. • Isso permite mudar a estrutura sem afectar quem a utiliza. • Às vezes é necessário permitir que mais de um cliente faça o percurso da estrutura simultaneamente.
Como Percorrer uma Estrutura • Para determinadas estruturas, pode haver formas diferentes de percorrer e queremos encapsular a forma exacta de percorrer a estrutura. • Por exemplo: • Uma fila pode ser percorrida nos sentidos frente=>fundo ou fundo=>frente • Uma pilha pode ser percorrida do topo para a base e da da base para o topo • Pode ser necessário criar um “filtro" que só retorne certos elementos
Permissas do Iterator • Um iterador deve ter um interface suficientemente genérica e simples de forma que possa ser usado para percorrer todos os TADs • Criar o iterador: • O iterador depende do TADs a ser percorrido, sendo necessário que seja criado pelo mesmo • Aplicabilidade • O padrão Iterator deve ser usado: • Para aceder o conteúdo de um objecto agregado sem expor a sua representação interna • Para suportar múltiplas formas de varrimento • Para proporcionar uma interface única para percorrer TADs diferentes
<<Interface>> Colecção getIterator() <<Interface>> Iterator hasNext():boolean next():Object ColecçãoConcreta IteradorConcreto getIterator():Iterator Diagrama UML
Diagrama UML: Actores • Iterator • Define uma interface para aceder e percorrer os elementos • IteradorConcreto • Implementa a interface Iterador • Mantém a posição corrente (e qualquer outro estado) no percurso do TAD • Colecção • Define uma interface para criar um objecto Iterador • ColecçãoConcreta • Implementa a interface que cria o Iterador para retornar o IteradorConcreto apropriado
Iterador • java.util.Iterator (5.0) suporta os seguintes métodos: • boolean hasNext() Retorna true se existirem mais elementos no Iterador. • Object next()Retorna o próximo elemento no Iterador. • void remove()- opcional Remove o último elemento devolvido pelo Iterador • Podemos definir o nosso interface public interface Iterator{ boolean hasNext(); Object next(); }
<<Interface>> Colecção getIterator() <<Interface>> Iterator hasNext():boolean next():Object EstruturaLinear EstruturaLinearIterator getIterator():Iterator Diagrama UML
Iterador numa Estrutura Linear EstáticaUso de classe local public class EstruturaLinearEstaticaimplements estruturaLinear{ private Object []tab; private int tamanho; private class IteratorEst implements Iterator{ int pos = 0; public boolean hasNext(){ return (pos < tamanho ); } public Object next(){ return tab[pos++]; } } public Iterator getIterator() { return new IteratorEst(); } //implementação de todos os métodos da Interface estruturaLinear }
Iterador numa Estrutura Linear DinâmicaUso de classe local public class EstruturaLinearDinamicaimplements estruturaLinear{ private No cabeca; private int tamanho; private class ListaEncadeadaIterator implements Iterator { No pos = cabeca; public boolean hasNext(){ return (pos != null ); } public Object next(){ Object cur = pos.getElemento(); pos = pos.getProximo(); return cur; } } public Iterator getIterator() { return new ListaEncadeadaIterator(); }
Iterador numa Estrura Linear public static void main (String args[]){ Iterator ai, ai2; EstruturaLinears; s = new EstruturaLinearDinamica(); for( int i = 0; i < 10; i++ ) s.inserir( new Integer(i) ); ai = s.getIterator(); while (ai.hasNext()){ System.out.println("\n1 Iterador: "+ai.next()); System.out.print(" 2 Iterador:"); for (ai2 = s.getIterator(); ai2.hasNext();) System.out.print(" "+ai2.next()); } } }