[Patrones de diseño] - 16, patrón iterador

(16) Modo iterador

El Iterator Pattern funciona proporcionando una forma de acceder a colecciones/contenedores en orden sin exponer la representación interna de la colección. Puede proporcionar un comportamiento transversal uniforme para diferentes contenedores, independientemente de la construcción de los elementos dentro del contenedor.

1. Principios de diseño del patrón iterador

1. Iterador abstracto: el iterador abstracto define la interfaz para acceder y atravesar elementos;

2. ConcreateIterator: proporciona un comportamiento transversal específico;

3. Contenedor abstracto (IAggregate): define una interfaz que proporciona iteradores específicos;

4, contenedor concreto (ConcreateAggregate): crea un iterador concreto.

2. Ejemplo sencillo

Escriba un iterador para iterar sobre la información del curso.

public interface Iterator<E> {
    
    
    E next();
    boolean hasNext();
}
public class IteratorImpl<E> implements Iterator<E> {
    
    
//    实现迭代器内部维护一个list,element,index
    private List<E> list;
    private int cursor;
    private E element;

    public IteratorImpl(List<E> list) {
    
    
        this.list = list;
    }

//    获取下一个元素
    @Override
    public E next() {
    
    
        System.out.print("当前位置: "+cursor);
        element = list.get(cursor);
        cursor++;
        return element;
    }

//    判断下一个位置是否有元素
    @Override
    public boolean hasNext() {
    
    
        return cursor > list.size()-1 ? false : true;
    }
}
public interface CourseAggregate {
    
    
    void add(Course course);
    void remove(Course course);
    Iterator<Course> iterator();
}
public class CourseAggregateImpl implements CourseAggregate {
    
    

    private List courseList;

    public CourseAggregateImpl() {
    
    
        this.courseList = new ArrayList();
    }

    @Override
    public void add(Course course) {
    
    
        courseList.add(course);
    }

    @Override
    public void remove(Course course) {
    
    
        courseList.remove(course);
    }

    @Override
    public Iterator<Course> iterator() {
    
    
        return new IteratorImpl<>(courseList);
    }
}
public class Course {
    
    
    private String name;

    public Course(String name) {
    
    
        this.name = name;
    }
	//get,set
}
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Course java = new Course("java");
        Course python = new Course("python");
        Course ai = new Course("ai");

        CourseAggregateImpl courseAggregate = new CourseAggregateImpl();

        courseAggregate.add(java);
        courseAggregate.add(python);
        courseAggregate.add(ai);

        print(courseAggregate);

    }

    public static void print(CourseAggregate courseAggregate) {
    
    
        Iterator<Course> iterator = courseAggregate.iterator();
        while (iterator.hasNext()) {
    
    
            Course course = iterator.next();
            System.out.println(course.getName());
        }
    }
}

imagen-20210316204627703

3. Comentarios sobre el modo iterador

El patrón de iterador abstrae la interfaz de iteración del elemento proporcionada por el propio objeto de colección al iterador, de modo que el objeto de colección no necesita preocuparse por el comportamiento de iteración específico. Es esencialmente una encapsulación. En general, el modo de iterador se puede usar para iterar la estructura de datos autoconstruida, y el iterador que viene con el marco se puede usar para otros.

Supongo que te gusta

Origin blog.csdn.net/qq_40589204/article/details/118343162
Recomendado
Clasificación