[Tipo de comportamiento] modo iterador

el código

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 只声明一个方法,为了建立一个可对应聚合的Iterator
 * @date 2023/5/29下午 4:08
 */
public interface Aggregate {
    
    
    /**
     * 在进行递增、遍历或者检查某个聚合时,利用 iterator 方法即可建立一个实现 Iterator 接口的类对象实例
     * @return
     */
     abstract Iterator iterator();
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 执行元素递增
 * @date 2023/5/29下午 4:09
 */
public interface Iterator {
    
    
    /**
     * 检查是否有下一元素
     * boolean 是结束与继续的条件
     * @return
     */
    abstract boolean hasNext();

    /**
     * 取得 下一元素
     * @return
     */
    abstract Object next();
}

 package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 书籍类
 * @date 2023/5/29下午 4:09
 */
public class Book {
    
    
    private String name = "";

    public Book(String name) {
    
    
        this.name = name;
    }

    public String getName() {
    
    
        return name;
    }
}

package com.fly.patterns.iterator;

import java.util.Vector;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 书架作用类; 要实现 Aggregate 接口 才能把本类当做聚合来处理。
 * @date 2023/5/29下午 4:39
 */
public class BookShelf implements Aggregate {
    
    
//    // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
//    private Book[] books;
//    private int last = 0;
//
//    public BookShelf(int maxsize){
    
    
//        this.books = new Book[maxsize];
//    }
//
//    public Book getBookAt(int index){
    
    
//        return books[index];
//    }
//
//    public void appendBook(Book book){
    
    
//        this.books[last] = book;
//        last++;
//    }
//
//    public int getLength(){
    
    
//        return last;
//    }
//
//    @Override
//    public Iterator iterator() {
    
    
//        return new BookShelfIterator(this);
//    }


    // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
    private Vector<Book> books;
    private int last = 0;

    public BookShelf(int maxsize){
    
    
        this.books = new Vector<>(maxsize);
    }

    public Book getBookAt(int index){
    
    
        return books.get(index);
    }

    public void appendBook(Book book){
    
    
        books.add(last,book);
        last++;
    }

    public int getLength(){
    
    
        return last;
    }

    @Override
    public Iterator iterator() {
    
    
        return new BookShelfIterator(this);
    }
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 扫描 BookShelf类的类
 * @date 2023/5/29下午 4:44
 */
public class BookShelfIterator implements Iterator {
    
    

    /**  要扫描的书架  */
    private BookShelf bookShelf;
    /**  书架的下标  */
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
    
    
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
    
    
        if (index < bookShelf.getLength()) {
    
    
            return true;
        } else {
    
    
            return false;
        }
    }

    @Override
    public Object next() {
    
    
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 测试类
 * @date 2023/5/29下午 4:49
 */
public class Main {
    
    
    public static void main(String[] args) {
    
    
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("第1本书 《我的世界》"));
        bookShelf.appendBook(new Book("第2本书 《世界简史》"));
        bookShelf.appendBook(new Book("第3本书 《人类监视》"));
        bookShelf.appendBook(new Book("第4本书 《动物世界》"));

        Iterator iterator = bookShelf.iterator();
        while (iterator.hasNext()){
    
    
            Book book = (Book)iterator.next();
            System.out.println(book.getName());
        }

    }
}

patrón de iterador

Este patrón se utiliza para acceder secuencialmente a los elementos de un objeto de colección sin conocer la representación subyacente del objeto de colección. El patrón iterador es un patrón de comportamiento. Le permite iterar sobre los objetos de la colección de una manera más flexible y extensible. Este modo atraviesa el objeto de la colección proporcionando un iterador (Iterator) en lugar de acceder directamente a los elementos de la colección. El patrón de iterador ayuda a desacoplar su código y facilita su mantenimiento y extensión.

  • Interfaces agregadas agregadas
  • ConcreteIterator (colección concreta)
  • Interfaz de iterador (iterador) para realizar incrementos y recorridos
  • Clase BookShelfIterator (iterador específico) para escanear estanterías
  • Libro libros
  • clase de estantería BookShelf
  • Clase de prueba principal

De hecho, aquí solo se usa el método hasNext next del iterador, y no se verá afectado por la clase BookShelf específica.
Actualmente, las matrices se usan para administrar libros. Si desea usar otras colecciones como List o Vector en el futuro, no importa cómo lo modifique, siempre que pueda de todos modos.
El iterador correcto está bien. El siguiente código no necesita ser cambiado en absoluto.

while (iterator.hasNext()){
    Book book = (Book)iterator.next();
    System.out.println(book.getName());
}

Escenas a utilizar:

1. Acceder al contenido de un objeto agregado sin exponer su representación interna.
2. Es necesario proporcionar múltiples métodos transversales para objetos agregados.
3. Proporcionar una interfaz unificada para atravesar diferentes estructuras de agregación.

Precauciones:

El modo de iterador separa el comportamiento transversal del objeto de la colección y abstrae una clase de iterador para que sea responsable, de modo que la estructura interna de la colección no pueda exponerse y el código externo pueda acceder de forma transparente a los datos dentro de la colección.

Resumir

El propósito de diseñar el patrón del iterador es mejorar la tasa de reutilización de la clase, que es usar la clase como un componente. Siempre que se modifique un determinado componente, no hay necesidad de modificar laboriosamente otros componentes.

Entonces, cuando configuramos el programa, no escribimos el valor de retorno del método iterador en una variable de la clase BookShelfIterator,
sino que lo asignamos al iterador. No usamos BookShelfIterator para implementar el programa, pero usamos el método de Iterador para implementar el programa.

Supongo que te gusta

Origin blog.csdn.net/daohangtaiqian/article/details/130933766
Recomendado
Clasificación