Una comprensión simple de los patrones de diseño de Java: patrón de iterador (reproducido)

Definición de patrón de iterador

El modo iterador (iterador) proporciona una forma de acceder secuencialmente a varios elementos en un objeto agregado sin exponer la representación interna del objeto.

El recorrido se usa comúnmente durante el desarrollo de Java. El siguiente programa paralelo:

for(int i =0 ;i<arr.length;i++){
    
    
    System.out.println(arr[i]);
}

En la instrucción for, i ++ se incrementa en 1 cada vez que se repite e itera al siguiente elemento. El patrón formado después de abstraer y generalizar el papel de las variables de bucle se convierte en el patrón de iterador en el patrón de diseño.

Escenario de realización

Coloque el libro (Libro) en la estantería (BookShelf) y muestre los títulos de los libros en orden.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ejemplo de programa

Interfaz agregada:
la interfaz de la colección que se va a atravesar. Una clase que implemente esta interfaz se convertirá en una colección que puede almacenar múltiples elementos, similar a una matriz.

public interface Aggregate{
    
    
    public abstract Iterator iterator();
}

El método declarado en la interfaz Aggregate es el iterador, que se utiliza para generar un iterador para el recorrido.

Interfaz de iterador:
se utiliza para atravesar los elementos de la colección, que es equivalente a la variable de bucle en la declaración de bucle (for (int i = 0; i <arr.lenth; i ++), que implementa específicamente un iterador de recorrido secuencial.

public interface Iterator{
    
    
    public abstract boolean hasNext();
    public abstract Object next();
}

El método hasNext () determina si hay uno siguiente, y el método next () obtiene el siguiente elemento.

Bajo instrucciones especiales, cuando el siguiente método obtiene el elemento, agrega uno al recuento del siguiente elemento. Obtenga el elemento actual y apunte al siguiente elemento.

Clase de libro: clase
general, método getName () del campo del título del libro para obtener el título del libro. El constructor inicializa el título del libro.

public class Book{
    
    
    private String name ;
    public Book(String name){
    
    
        this.name=name;
    }
    public String getName(){
    
    
        return name;
    }
}

Clase BookShelf: la
clase Bookshelf, como clase de colección para almacenar libros, implementa la interfaz Aggregate. Implementa el método iterador de la interfaz Aggregate.

public class BookShelf implements Aggregate {
    
    

    private List<Book> books;


    public BookShelf() {
    
    
        this.books = new ArrayList<Book>();
    }

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

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

    public int getLength() {
    
    
        return books.size();
    }

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

El punto principal es el método iterador, que devuelve la clase BookShelfIterator que se utilizará al atravesar la estantería como iterador de la estantería. Este método se llamará cuando el mundo exterior quiera atravesar la estantería.

Clase BookShelfIterator:

public class BookShelfIterator implements Iterator {
    
    

    private BookShelf bookShelf;
    private int index;

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

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


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

Como iterador, necesita implementar la interfaz Iterator. index es el índice al que apunta actualmente el iterador.
hasNext determina si hay un libro siguiente. Juzgue comparando el subíndice y el total.
Luego obtiene el libro actual y apunta al siguiente.

Clase principal:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        BookShelf bookShelf = new BookShelf();
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy-Long-Legs"));
        Iterator it = bookShelf.iterator();
        while (it.hasNext()) {
    
    
            Book book = (Book) it.next();
            System.out.println(book.getName());
        }
    }
}

控制台:
----------------------------------
Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs
----------------------------------

El rol de cada rol en el modo Iterador

  • Iterador: este rol es responsable de definir la interfaz de los elementos que atraviesan uno por uno en orden. En el programa, reproducido por la interfaz Iterator, se definen dos métodos haveNext y next.
  • Concretelterator (iterador específico): este rol es responsable de implementar la interfaz definida por el rol de Iterator, este rol contiene la información necesaria para recorrer la colección.
  • Agregado: este rol es responsable de definir la interfaz para crear el rol de Iterador. Esta interfaz es un método que crea uno y accede a las personas almacenadas en mis elementos internos en orden.
  • ConcreteAggregate (colección específica): este rol es responsable de implementar la interfaz definida por el rol Aggregate. Creará un rol de Iterador específico, que es ConcreteIterator, que es BookShelf en el ejemplo.

Diagrama de clases del modo Iterador:
Inserte la descripción de la imagen aquí

El enfoque del aprendizaje de patrones de diseño.
Iterator se puede utilizar sin importar cómo cambie la implementación.
¿Por qué deberíamos considerar la introducción del patrón de diseño complejo de Iterator?

Si es una matriz, ¿no se puede atravesar directamente con la declaración for fantasy?

¿Por qué introducir el rol de Iterador fuera de la colección?

Una razón importante: la introducción de Iterator puede separar el recorrido de la implementación.

while (it.hasNext ()) { Book book = (Book) it.next () ; System.out.println (book.getName ()); } El método hasNext del iterador y el método next se utilizan aquí, y BookShelf no se llama Métodos. En otras palabras, el ciclo while aquí no depende de la implementación de BookShelf.



Por ejemplo, los desarrolladores de BookShelf decidieron abandonar el uso de matrices para administrar libros y, en su lugar, usar Java.util.Vector en su lugar, lo que sucederá. No importa cómo cambie BookShelf, siempre que el método iterador de BookShelf pueda devolver correctamente la fuerza del Iterator, el código puede funcionar normalmente incluso sin ninguna modificación en el ciclo while anterior.

Es realmente conveniente para quien llama a BookShelf.

El papel de los patrones de diseño es ayudarnos a escribir clases reutilizables.

El llamado reutilizable se refiere a la realización de una clase como componente, cuando un componente cambia, otros componentes no necesitan ser modificados o solo se requiere una pequeña modificación para lidiar con él.

Esto también puede comprender por qué el valor de retorno del método iterador en el programa de muestra no es la clase bookshelfiter sino el tipo iter. Esto muestra que el programa debe utilizar el método iterador para programar en lugar del método bookshelfiterator.

Difícil de
entender clases e interfaces abstractas Las personas que tienen dificultades para entender clases e interfaces abstractas a menudo consumen roles de ConcreteAggregate y programación de roles de ConcreteIterator en lugar de interfaces de Aggregate e Iterator Siempre quieren usar clases concretas para resolver todos los problemas.

Sin embargo, si solo se usan clases específicas para resolver el problema, es fácil causar un fuerte acoplamiento entre clases, y estas clases también son difíciles de reutilizar como componentes. Para debilitar el acoplamiento entre clases y facilitar que las clases reutilizarse como componentes. Necesitamos introducir clases e interfaces abstractas.
Este tipo de pensamiento debería abarcar todo el patrón de diseño.

Correspondencia entre agregado e iterador Una característica del modo Iterador es que
múltiples iteradores
atravesarán funciones fuera del rol de agregado. Esta función puede escribir varios roles de ConcreteIterator para un rol de ConcreteAggregate.

Introduzca varios patrones de diseño por adelantado:

El modo
iterador del modo Vistor es sacar los elementos uno por uno de la colección para el recorrido, pero no realiza ningún procesamiento en los elementos extraídos en la interfaz del Iterador.

El modo Vistor realiza el mismo procesamiento en los elementos en el proceso de atravesar la colección de elementos.

En el proceso de atravesar la colección, a menudo es necesario realizar un procesamiento fijo en los elementos. El modelo de visitante apareció en respuesta a esta demanda. El mismo proceso se realiza sobre los elementos en el proceso de recolección de los elementos cuadrados, este modo es el modo Vistor.

Modo compuesto El modo
compuesto es un modo con una estructura recursiva, en el que el modo iterador es más difícil de usar.

Modo de método de fábrica El modo de método de fábrica
se puede utilizar cuando se genera la potencia de Iterator en el método de iterador.

Autor: toot bumper rattled
link: https: //www.jianshu.com/p/3dd7b4e73561
Fuente: Los libros de Jane
tienen derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización, y para reimpresiones no comerciales, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/qq_34365173/article/details/108560624
Recomendado
Clasificación