My logo
Published on

iterator 迭代器模式

其实一般很少自己写这个iterator模式的,一般都是在集合编程中使用,尤其是如果要对集合元素遍历过程中做插入删除操作,那就用iterator,可以通过JDK已经封装好的iterator模式,加深印象,如果要对某个类中的集合进行遍历,由那个集合类返回一个iterator回来,我们统一面向iterator迭代器接口来编程遍历,提高系统整体的可维护性,可扩展性

如果自己写iterator模式,一般是研发底层的框架,比如提供某个数据给外部遍历,那么可以使用iterator模式自己封装迭代器,可以自己去实践。

现在假设,有一个教室类,里面包含了一堆学生,我现在要遍历教室里的学生:

一般模式编写:

package wang.jinggo.basics.zhss.iterator;

import java.util.HashMap;
import java.util.Map;

/**
 * 没有是使用模式
 *
 * @author: wangyj
 * @create: 2021-10-18
 * @version: 1.0.0
 **/
public class WithoutIteratorPatternDemo {

    public static void main(String[] args) {
        Student student1 = new Student("小明");
        Student student2 = new Student("小王");

        //		Student[] students = new Student[2];
        //		students[0] = student1;
        //		students[1] = student2;
        Map<String, Student> students = new HashMap<String, Student>();
        students.put(student1.getName(), student1);
        students.put(student2.getName(), student2);

        Classroom classroom = new Classroom();
        classroom.setStudents(students);

        //		Student[] resultStudents = classroom.getStudents();
        //		for(Student resultStudent: resultStudents) {
        //			System.out.println(resultStudent);
        //		}

        Map<String, Student> resultStudents = classroom.getStudents();
        for(Student resultStudent : resultStudents.values()) {
            System.out.println(resultStudent);
        }

        // 如果不用任何设计模式,直接去遍历一个类中的集合
        // 一旦这个类中对集合的使用改版了,比如从数组 -> map,还有别的可能
        // 你迭代的这块代码,就要改动
        // 如果说代码和业务逻辑很复杂,同时集合类的实现和遍历代码的实现,是两个人开发的
        // 成本就很高了,大家又要协调,又要改动
        // 简单来说,这种代码,可扩展性,可维护性,很差。屎一样的代码
    }

    /**
     *
     */
    public static class Student {
        private String name;

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

        public String getName() {
            return name;
        }

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

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

    //	/**
    //	 * 教室类
    //	 *
    //	 */
    //	public static class Classroom {
    //
    //		private Student[] students;
    //
    //		public Student[] getStudents() {
    //			return students;
    //		}
    //
    //		public void setStudents(Student[] students) {
    //			this.students = students;
    //		}
    //
    //	}

    /**
     * 教室类
     *
     */
    public static class Classroom {

        private Map<String, Student> students;

        public Map<String, Student> getStudents() {
            return students;
        }

        public void setStudents(Map<String, Student> students) {
            this.students = students;
        }

    }
}

使用设计模式编写:

package wang.jinggo.basics.zhss.iterator;

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

/**
 * 用迭代器模式的实现
 *
 * @author: wangyj
 * @create: 2021-10-18
 * @version: 1.0.0
 **/
public class IteratorPatternDemo {

    public static void main(String[] args) {
        Student student1 = new Student("小明");
        Student student2 = new Student("小王");

        Classroom classroom = new Classroom(2);
        classroom.addStudent(student1);
        classroom.addStudent(student2);

        java.util.Iterator<Student> iterator = classroom.iterator();
        while (iterator.hasNext()) {
            Student student = (Student) iterator.next();
            System.out.println(student);
        }
    }

    /**
     * 定义一个我们自己的迭代器接口
     *
     * @author zhonghuashishan
     */
    public interface Iterator {

        public abstract boolean hasNext();

        public abstract Object next();

    }

    /**
     * 代表了一个集合类
     *
     * @author zhonghuashishan
     */
    public interface Aggregate {

        public abstract java.util.Iterator<Student> iterator();

    }

    /**
     * 学生类
     *
     * @author zhonghuashishan
     */
    public static class Student {

        private String name;

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

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "Student [name=" + name + "]";
        }

    }

    /**
     * 教室迭代器
     *
     * @author zhonghuashishan
     */
    public static class ClassroomIterator implements Iterator {

        private Classroom classroom;
        private int index;

        public ClassroomIterator(Classroom classroom) {
            this.classroom = classroom;
            this.index = 0;
        }

        /**
         * 假设此时index是0,classroom的length是2
         * 那么肯定是可以去获取下一个学生的,此时数组还没遍历完
         * <p>
         * 假设此时index是2,classroom的length是2,classroom可以遍历的数组的offset只能是0和1
         */
        public boolean hasNext() {
            if (index < classroom.getLength()) {
                return true;
            } else {
                return false;
            }
        }

        /**
         * 从数组中获取当前的这个学生,同时将index往下移动一位
         * 比如一开始index是0,然后数组长度是2
         * 此时遍历获取了第一个学生之后,返回了数组的0元素,然后将index变为1了
         */
        public Object next() {
            Student student = classroom.getStudent(index);
            index++;
            return student;
        }

    }

    /**
     * 教室类
     *
     * @author zhonghuashishan
     */
    public static class Classroom implements Aggregate {

//	    private Student[] students;

        private List<Student> students;

        /**
         * last相当于是数组的长度
         */
        private int last = 0;

        public Classroom(int size) {
//	        this.students = new Student[size];
            this.students = new ArrayList<Student>(2);
        }

        public Student getStudent(int index) {
//	        return students[index];
            return students.get(index);
        }

        public void addStudent(Student student) {
//	        this.students[last] = student;
            this.students.add(student);
            last++;
        }

        public int getLength() {
            return last;
        }

        /**
         * 返回一个教室迭代器,其中封装了教室自己,让迭代器可以获取教室中的数据
         */
        public java.util.Iterator<Student> iterator() {
//	        return new ClassroomIterator(this);
            return students.iterator();
        }

    }

}