:::info 迭代器模式如此常用,以至于很多编程语言都默认实现了此模式。虽然我们天天都在用迭代器模式,但却很少有自己实现的机会。 :::

定义

提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

使用场景

在java开发中,当你要你要实现自己的容器类,且要迭代里面的元素时。换句话还可以说,当你要使自己的类支持foreach 操作的时候使用此模式。

UML

角色结构

优点

  • 它支持以不同的方式遍历一个聚合对象。
  • 迭代器简化了聚合类。
  • 在同一个聚合上可以有多个遍历。
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    缺点

    由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    代码示例

    由于Java已经天然支持了迭代器模式,我们直接使用就好了。主要涉及如下两个接口

    1. public interface Iterator<E> {
    2. boolean hasNext();
    3. E next();
    4. //java8后加入的default方法
    5. ...
    6. }
    1. public interface Iterable<T> {
    2. Iterator<T> iterator();
    3. //java8后加入的default方法
    4. ...
    5. }

    MyList 实现自己的list

    1. public class MyList implements Iterable<Student> {
    2. private final List<Student> students = new ArrayList<>();
    3. public MyList() {
    4. students.add(new Student("王二狗", 28));
    5. students.add(new Student("牛翠花", 20));
    6. students.add(new Student("林蛋大", 29));
    7. }
    8. public boolean addStudent(Student student){
    9. return students.add(student);
    10. }
    11. public boolean removeStudent(Student student){
    12. return students.remove(student);
    13. }
    14. @Override
    15. public Iterator<Student> iterator() {
    16. return new Itr();
    17. }
    18. private class Itr implements Iterator<Student> {
    19. int index = 0;
    20. @Override
    21. public boolean hasNext() {
    22. if (index < students.size()) {
    23. return true;
    24. }
    25. return false;
    26. }
    27. @Override
    28. public Student next() {
    29. Student student = students.get(index);
    30. index++;
    31. return student;
    32. }
    33. }
    34. }

    Student

    1. @Data
    2. @AllArgsConstructor
    3. public class Student {
    4. private String name;
    5. private Integer age;
    6. }

    Client

    1. public class Client {
    2. public static void main(String[] args) {
    3. MyList cls = new MyList();
    4. System.out.println("--------------开始点名--------------");
    5. Iterator<Student> iterator = cls.iterator();
    6. while (iterator.hasNext()) {
    7. System.out.println(iterator.next());
    8. }
    9. }
    10. }

    输出

    1. --------------开始点名--------------
    2. Student(name=王二狗, age=28)
    3. Student(name=牛翠花, age=20)
    4. Student(name=林蛋大, age=29)