Patrones de diseño Notas del patrón iterador

ilustrar

Registre el método de escritura para aprender el patrón de diseño-patrón iterador. La versión de JDK utilizada es la versión 1.8.

Iterador

Intención : proporcionar una manera de acceder secuencialmente a elementos individuales en un objeto agregado sin exponer la representación interna del objeto.
Estructura :
Insertar descripción de la imagen aquí
donde:

  • Iterador (selector) define la interfaz para acceder y atravesar elementos.
  • Concretelterator (iterador de hormigón) implementa la interfaz de selección: rastrea la posición actual al atravesar el agregado.
  • Aggregate define la interfaz para crear los objetos selectores correspondientes.
  • ConcreteAggregate (agregación concreta) implementa la interfaz que crea el selector correspondiente. Esta operación devuelve una instancia apropiada de Concretelterator.

aplicabilidad:

  • Acceda al contenido de un objeto agregado sin exponer su representación interna.
  • Admite múltiples recorridos de objetos agregados.
  • Proporciona una interfaz unificada para atravesar diferentes estructuras agregadas.

Tabla de contenido

Insertar descripción de la imagen aquí

Diagrama de clases de ejemplo de patrón iterador

Insertar descripción de la imagen aquí
Implemente el ejemplo del patrón Iterador con este diagrama de clases UML.

categoría de estudiante

package com.example.deesign_patterns.iterator;

//学生类
public class Student {
    
    

    private String name;
    private String number;

    public Student(String name, String number) {
    
    
        this.name = name;
        this.number = number;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getNumber() {
    
    
        return number;
    }

    public void setNumber(String number) {
    
    
        this.number = number;
    }

    @Override
    public String toString() {
    
    
        return "Student{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                '}';
    }
}

Interfaz de rol de iterador abstracto

package com.example.deesign_patterns.iterator;

//抽象迭代器角色接口
public interface StudentIterator {
    
    

    //判断是否还有元素
    boolean hasNext();

    //获取下一个元素
    Student next();
}

Clase de rol de iterador concreto

package com.example.deesign_patterns.iterator;

import java.util.List;

//具体迭代器角色类
public class StudentIteratorImpl implements StudentIterator{
    
    

    private List<Student> list;
    private int position=0;//用来记录遍历时的位置

    public StudentIteratorImpl(List<Student> list) {
    
    
        this.list = list;
    }

    @Override
    public boolean hasNext() {
    
    
        return position< list.size();
    }

    @Override
    public Student next() {
    
    
        //从集合中获取指定位置的元素
        Student currentStudent = list.get(position);
        position++;
        return currentStudent;
    }
}

Interfaz de rol agregado abstracto

package com.example.deesign_patterns.iterator;

//抽象聚合角色接口
public interface StudentAggregate {
    
    

    //添加学生功能
    void addStudent(Student stu);

    //删除学生功能
    void removeStudent(Student stu);

    //获取迭代器对象功能
    StudentIterator getStudentIterator();
}

Clase de rol agregado concreto

package com.example.deesign_patterns.iterator;

import java.util.ArrayList;
import java.util.List;

//具体聚合角色类
public class StudentAggregateImpl implements StudentAggregate{
    
    

    private List<Student> list=new ArrayList<Student>();

    @Override
    public void addStudent(Student stu) {
    
    
        list.add(stu);
    }

    @Override
    public void removeStudent(Student stu) {
    
    
        list.remove(stu);
    }

    //获取迭代器对象
    @Override
    public StudentIterator getStudentIterator() {
    
    
        return new StudentIteratorImpl(list);
    }
}

clase de prueba

package com.example.deesign_patterns.iterator;

//测试类
public class Client {
    
    

    public static void main(String[] args) {
    
    
        //创建聚合对象
        StudentAggregateImpl aggregate=new StudentAggregateImpl();
        //添加元素
        aggregate.addStudent(new Student("张三","001"));
        aggregate.addStudent(new Student("李四","002"));
        aggregate.addStudent(new Student("王五","003"));
        aggregate.addStudent(new Student("赵六","004"));
        //遍历聚合对象
        //获取迭代器对象
        StudentIterator iterator=aggregate.getStudentIterator();
        //遍历
        while (iterator.hasNext()){
    
    
            //获取元素
            Student student=iterator.next();
            System.out.println(student.toString());
        }
    }
}

Insertar descripción de la imagen aquí

beneficio:

  • Admite atravesar un objeto agregado de diferentes maneras y se pueden definir múltiples métodos de recorrido en el mismo objeto agregado. En el modo iterador, solo necesita reemplazar el iterador original con un iterador diferente para cambiar el algoritmo transversal. También podemos definir una subclase del iterador nosotros mismos para admitir nuevos métodos transversales.
  • Los selectores simplifican las clases agregadas. Debido a la introducción de iteradores, no es necesario proporcionar recorrido de datos ni otros métodos en el objeto agregado original, lo que puede simplificar el diseño de clases agregadas.
  • En el patrón de iterador, debido a la introducción de la capa de abstracción, es muy conveniente agregar nuevas clases agregadas y clases de iterador sin modificar el código original, lo que cumple con los requisitos del "principio de apertura y cierre".

defecto:

  • Se aumenta el número de clases, lo que aumenta en cierta medida la complejidad del sistema.

Supongo que te gusta

Origin blog.csdn.net/weixin_48040732/article/details/131365275
Recomendado
Clasificación