迭代器模式:理解与实践 您所在的位置:网站首页 迭代器的种类有哪些 迭代器模式:理解与实践

迭代器模式:理解与实践

2024-06-19 01:13| 来源: 网络整理| 查看: 265

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)什么是迭代器模式

迭代器模式应该是23种设计模式中,程序员最容易理解的设计模式了,因为迭代器模式在日常的开发过程中经常使用到。以最常见的循环为例:

for(int i=0;i Iterator iterator(); } public interface Iterator { boolean hasNext(); Object next(); }

接着定义学生类:

@Data @AllArgsConstructor public class Student { private String name; }

接着定义教室类,在教室类中我们定义了Student集合,以及当前的集合长度和最大长度。同时实现Aggregate接口的iterator方法,这个方法将会返回一个迭代器对象。这个迭代器对象由ClassroomIterator提供

public class Classroom implements Aggregate{ private Student[] students; private int length=0; private int maxSize; public Classroom(int maxSize){ this.maxSize=maxSize; students=new Student[maxSize]; } public Student getStudent(int index){ return students[index]; } public boolean addStudent(Student student){ if (length>=maxSize){ return false; } this.students[length]=student; length++; return true; } public int getLength(){ return this.length; } @Override public Iterator iterator() { return new ClassroomIterator(this); } }

最后就是ClassroomIterator对象了,ClassroomIterator属于迭代器的具体实现,这里需要实现hasNext方法和next方法

public class ClassroomIterator implements Iterator{ private Classroom classroom; private int index; public ClassroomIterator(Classroom classroom){ this.classroom=classroom; this.index=0; } @Override public boolean hasNext() { if (this.index Student student = classroom.getStudent(index); index++; return student; } }

最后就是使用了,通过迭代器对象,我们可以直接遍历classroom对象:

public static void main(String[] args) { Classroom classroom=new Classroom(3); classroom.addStudent(new Student("张三")); classroom.addStudent(new Student("李四")); classroom.addStudent(new Student("王五")); Iterator iterator = classroom.iterator(); while (iterator.hasNext()){ Student next = (Student) iterator.next(); System.out.println(next.getName()); } } (四)迭代器模式的作用

看到这里很多人可能会有疑问,写了一堆,用循环不是更方便吗?迭代器模式最大的作用是将遍历和具体的实现分开,以上面的测试方法为例,遍历时我们始终只用到了iterator对象,而没有用到classroom,这就意味着我们之后可以完全复用这段代码实现遍历。

另一方面,如果我们发现在classroom里使用数组存储student,后续无法扩容,想改为List集合,这个时候我们只需要修改ClassroomIterator和Classroom这两个具体实现角色即可。而不用对使用中的代码做任何修改,就比如上面这段测试遍历代码不需要任何变动。如果用的是for循环或者while循环,就意味着所有用到循环的地方都需要修改代码。

(五)迭代器模式在源码中的应用

迭代器模式的应用我们在敲代码时肯定都用过,迭代器模式最佳实践就是JDK中Iterator接口的设计

public interface Iterator { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }

具体的迭代器实现最常用的就是集合,随便找个ArrayList看一下源码:

整体的实现逻辑和我们上面实现的基本上十分相似。

(五)总结

在学习设计模式的时候,会慢慢开始理解为什么要设计接口,而不是直接写各种类。如果用具体的类去解决一个个需求,就会导致类之间的强依赖,这些类也难以被拆分出来作为组件复用。我是鱼仔,我们下期再见!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有