[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
ProfileIteratordefine três métodos:hasNext(), que retornatruese 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
FacebookIteratoreLinkedInIteratorimplementam a interfaceProfileIteratore 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
SocialNetworkdefine dois métodos que criam instâncias deProfileIteratorpara percorrer a lista de amigos ou colegas de trabalho de um determinado perfil. - A classe
Facebookimplementa a interfaceSocialNetworke fornece implementações dos métodoscreateFriendsIterator()ecreateCoworkersIterator(), que retornam instâncias deFacebookIterator. - A classe
SocialSpammerapresentada é responsável por enviar mensagens de spam para amigos e colegas de trabalho em uma rede social, usando uma instância da classeSocialNetworkque 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 interfaceProfileIteratorpara 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



