[sw design pattern] Iterator (Iterador)
Os padrões de design GoF são classificados em três categorias: Criacionais, Comportamentais e Estruturais. Os padrões criacionais tratam da criação de objetos, enquanto os padrões estruturais lidam com a estrutura das classes, como herança e composição. Por fim, os padrões comportamentais lidam com a comunicação entre objetos e suas interações. Estes padrões de projeto se encontram no livro “Padrões de Projetos: Soluções Reutilizáveis de Software Orientado a Objetos” escrito por 4 autores denominados GoF (Gang of Four).
O padrão de design Iterator é um dos padrões comportamentais mais úteis para se trabalhar com coleções de objetos. Ele permite percorrer uma coleção sem expor sua implementação subjacente e é muito utilizado em várias linguagens de programação.
Em resumo, o padrão Iterator fornece um meio de acessar sequencialmente os elementos de uma coleção, sem expor os detalhes de como a coleção é implementada. O Iterator oferece uma interface que permite acessar cada elemento da coleção, um de cada vez, sem a necessidade de conhecer a estrutura interna da coleção.
O padrão Iterator geralmente é implementado usando uma classe Iterator que é responsável por manter o estado atual da iteração e fornecer métodos para obter o próximo elemento da coleção e verificar se há mais elementos disponíveis. A classe da coleção deve implementar um método que retorna uma instância do Iterator, que pode então ser usado para iterar pela coleção.
O padrão de design Iterator pode estar relacionado com outros padrões de design de software. Em particular, ele está relacionado com o padrão Composite, pois ambos são usados para trabalhar com coleções de objetos.
O Iterator é usado para percorrer sequencialmente uma coleção sem expor sua implementação subjacente. O Composite é usado para representar hierarquias de objetos, onde cada objeto pode ter filhos que também são objetos. Em muitos casos, esses filhos podem ser tratados como coleções e, portanto, o padrão Iterator é frequentemente usado para iterar pelos filhos de um objeto Composite.
Além disso, o padrão Iterator é frequentemente usado em conjunto com outros padrões de design, como o padrão Factory Method e o padrão Template Method. O Factory Method é usado para criar objetos sem precisar especificar a classe concreta do objeto que será criado, enquanto o Template Method é usado para definir a estrutura geral de um algoritmo, permitindo que as subclasses forneçam implementações específicas para partes do algoritmo.
Um exemplo simples de uso do Iterator é através do método iterator()
, que pode ser chamado em qualquer coleção de elementos em Java, e retorna uma instância do objeto Iterator
para percorrer os elementos da coleção.
Por exemplo, suponha que temos uma lista de números inteiros chamada listaDeNumeros
, e queremos percorrer cada elemento usando o Iterator. Podemos fazer isso com o seguinte código em Java:
List<Integer> listaDeNumeros = new ArrayList<Integer>();
listaDeNumeros.add(1);
listaDeNumeros.add(2);
listaDeNumeros.add(3);
Iterator<Integer> iterator = listaDeNumeros.iterator();
while(iterator.hasNext()) {
Integer numeroAtual = iterator.next();
System.out.println(numeroAtual);
}
Nesse código, estamos criando uma lista de números inteiros e adicionando 3 elementos à ela. Em seguida, criamos um objeto Iterator chamando o método iterator()
da lista. Usando o método hasNext()
, o laço while irá percorrer cada elemento da lista enquanto houver elementos. O método next()
retorna o elemento atual do Iterator, que é armazenado em uma variável inteira numeroAtual
. Por fim, imprimimos cada elemento na tela com o método System.out.println()
Esse código exemplifica como usar o padrão Iterator em Java para percorrer uma lista de elementos de forma sequencial sem expor sua implementação subjacente.
links externos com mais exemplos do padrão Iterator:
—> O código fornecido no exemplo do link abaixo implementa o padrão de design Iterator em Java. O código define a interface ChannelCollection
que fornece métodos para adicionar e remover canais e um método para obter um iterador. A interface ChannelIterator
define métodos para verificar se há elementos restantes e para retornar o próximo elemento do grupo.
A classe ChannelCollectionImpl
implementa a interface ChannelCollection
, usando uma lista de canais. A classe ChannelIteratorImpl
implementa a interface ChannelIterator
e itera sobre a lista de canais com base no tipo de canal fornecido.
A classe ChannelTypeEnum
é uma enumeração que define os tipos de canal disponíveis. A classe Channel
define um canal com um determinado tipo e frequência.
A classe IteratorPatternTest
é a classe principal do programa e demonstra como usar o padrão Iterator . O método populateChannels()
é usado para preencher uma lista de canais e obter iteradores para a lista com base no tipo de canal.
Em resumo, o código implementa o padrão Iterator em Java, fornecendo uma maneira padronizada de percorrer uma lista de canais com base no tipo de canal.
https://www.digitalocean.com/community/tutorials/iterator-design-pattern-java
—> O código apresentado abaixo é um exemplo da implementação do padrão de projeto Iterator em Java. O código apresentado contém as seguintes interfaces e classes:
- A interface
ProfileIterator
define três métodos:hasNext()
, que retornatrue
se a iteração possui mais elementos;getNext()
, que retorna o próximo elemento da iteração; ereset()
, que reseta a posição atual da iteração. - As classes
FacebookIterator
eLinkedInIterator
implementam a interfaceProfileIterator
e adicionam campos adicionais para manter o estado da iteração, como a lista de amigos ou colegas de trabalho e a posição atual da iteração. Essas classes também definem o métodolazyLoad()
, que carrega as informações do próximo elemento apenas quando necessário, para evitar carregar toda a lista de uma só vez. - A interface
SocialNetwork
define dois métodos que criam instâncias deProfileIterator
para percorrer a lista de amigos ou colegas de trabalho de um determinado perfil. - A classe
Facebook
implementa a interfaceSocialNetwork
e fornece implementações dos métodoscreateFriendsIterator()
ecreateCoworkersIterator()
, que retornam instâncias deFacebookIterator
. - A classe
SocialSpammer
apresentada é responsável por enviar mensagens de spam para amigos e colegas de trabalho em uma rede social, usando uma instância da classeSocialNetwork
que foi passada como argumento para seu construtor. Essa classe possui dois métodos para enviar spam para amigos e colegas de trabalho, ambos usando uma instância da interfaceProfileIterator
para iterar sobre a lista de amigos ou colegas de trabalho de um determinado perfil de email. Em seguida, o métodosendMessage()
é chamado para enviar a mensagem para cada perfil iterado.
https://refactoring.guru/design-patterns/iterator/java/example