1 概念

迭代器模式在设计模式中属于行为型模式,用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式的结构中包括四种角色:

  • 抽象集合(Abstract Aggregate)
  • 具体集合(Concrete Aggregate)
  • 抽象迭代器(Abstract Iterator)
  • 具体迭代器(Concrete Iterator)

2 案例说明

对Student类实现迭代输出

深入浅出迭代器模式_java

3 代码实现

Aggregate.java

/**
* @desc: 集合容器抽象
* @author: YanMingXin
* @create: 2021/8/31-15:53
**/
public interface Aggregate {

public Iterator iterator();

}

Iterator.java

/**
* @desc: 抽象迭代器
* @author: YanMingXin
* @create: 2021/8/31-15:53
**/
public interface Iterator<E> {

public boolean hasNext();

public E next();

}

Student.java

/**
* @desc: Student实体类
* @author: YanMingXin
* @create: 2021/8/31-15:54
**/
public class Student {

private Integer id;

private String name;

private Integer age;

public Student() {

}

public Student(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

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

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

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

StudentIterator.java

/**
* @desc: 具体迭代器
* @author: YanMingXin
* @create: 2021/8/31-15:55
**/
public class StudentIterator implements Iterator {

private StudentShelf studentShelf;

private int index;

public StudentIterator(StudentShelf studentShelf) {
this.studentShelf = studentShelf;
this.index = 0;
}

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

@Override
public Object next() {
Student studentAt = studentShelf.getStudentAt(index);
index += 1;
return studentAt;
}
}

StudentShelf.java

/**
* @desc: 集合容器具体实现
* @author: YanMingXin
* @create: 2021/8/31-16:11
**/
public class StudentShelf implements Aggregate {

private Student[] students;

private int size = 0;

private final int DEFAULT_SIZE = 10;

public StudentShelf() {
this.students = new Student[DEFAULT_SIZE];
}

public StudentShelf(int maxsize) {
this.students = new Student[maxsize];
}

public Student getStudentAt(int index) {
return students[index];
}

public void appendStudent(Student student) {
this.students[size] = student;
size++;
if (size >= DEFAULT_SIZE) {
//扩容
Student[] stus = new Student[size * 2];
System.arraycopy(this.students, 0, stus, 0, this.students.length);
this.students = stus;
}
}

public int getLength() {
return size;
}

@Override
public Iterator<Student> iterator() {
return new StudentIterator(this);
}
}

MyIterator.java

/**
* @desc: 迭代器模式测试
* @author: YanMingXin
* @create: 2021/8/31-15:51
**/
public class MyIterator {


public static void main(String[] args) {
StudentShelf shelf = new StudentShelf();
shelf.appendStudent(new Student(1,"zs",23));
shelf.appendStudent(new Student(2,"ls",24));
shelf.appendStudent(new Student(3,"ww",25));

Iterator<Student> iterator = shelf.iterator();
while (iterator.hasNext()){
Student next = iterator.next();
System.out.println(next);
}
}

}

测试结果:

深入浅出迭代器模式_javase_02

4 小总结

迭代器模式相比其他设计模式感觉实现起来麻烦一些,而且还不如for循环好用,那是因为Java内部已经集成了迭代器模式,这样就不用我们开发人员每次使用都进行迭代,而可以直接使用。