image

Access unlimited bootcamps and 650+ courses forever

60
%OFF
Article image
Giovanni Rozza
Giovanni Rozza02/05/2023 23:11
Share

[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 retorna true se a iteração possui mais elementos; getNext(), que retorna o próximo elemento da iteração; e reset(), que reseta a posição atual da iteração.
    • As classes FacebookIterator e LinkedInIterator implementam a interface ProfileIterator 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étodo lazyLoad(), 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 de ProfileIterator para percorrer a lista de amigos ou colegas de trabalho de um determinado perfil.
    • A classe Facebook implementa a interface SocialNetwork e fornece implementações dos métodos createFriendsIterator() e createCoworkersIterator(), que retornam instâncias de FacebookIterator.
    • 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 classe SocialNetwork 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 interface ProfileIterator para iterar sobre a lista de amigos ou colegas de trabalho de um determinado perfil de email. Em seguida, o método sendMessage() é chamado para enviar a mensagem para cada perfil iterado.

    https://refactoring.guru/design-patterns/iterator/java/example

    Share
    Comments (0)