迭代器模式:理解与实践

简介: 上面的这段代码通过循环逐一将arr的下标加1,从而实现了遍历数组的功能。但是通过循环实现遍历的话依赖于集合对象内部,因此就有了一种能顺序访问集合对象中各个元素,又无需依赖对象内部表示的设计模式--迭代器模式。

听说微信搜索《Java鱼仔》会变更强哦!


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


(一)什么是迭代器模式


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


for(inti=0;i<arr.length;i++){
System.out.print(arr[i]);
}

上面的这段代码通过循环逐一将arr的下标加1,从而实现了遍历数组的功能。


但是通过循环实现遍历的话依赖于集合对象内部,因此就有了一种能顺序访问集合对象中各个元素,又无需依赖对象内部表示的设计模式--迭代器模式。


(二)迭代器模式中的角色


迭代器模式中的角色主要有4种:


1、迭代器接口(Iterator):定义访问和遍历集合元素的接口,一般包含next()和hasNext()方法。


2、具体迭代器(ConcreteIterator):该角色用于实现迭代器接口,迭代器的核心遍历逻辑在这里实现。


3、集合接口(Aggregate):集合接口定义了创建迭代器的接口方法,内部定义了iterator方法。


4、具体集合(ConcreteAggregate):该角色用于实现集合接口,他会创建出具体的Iterator角色。


看到这里如果你觉得比较疑惑不要紧,下面会通过代码的方式来加深理解。


(三)迭代器模式的代码实现


首先说一下这段代码的场景,定义了一个教室的类,又定义了学生的类,实现遍历教室中学生的功能。


代码列表如下:


interfaceAggregate:集合接口interfaceIterator:迭代器接口classClassroom:教室类,实现集合接口,属于具体的集合classClassroomIterator:教室迭代器,实现迭代器接口,属于具体的迭代器classStudent:学生类

首先把迭代器模式中的两个接口角色定义出来:

publicinterfaceAggregate {
Iteratoriterator();
}
publicinterfaceIterator {
booleanhasNext();
Objectnext();
}

接着定义学生类:

@Data@AllArgsConstructorpublicclassStudent {
privateStringname;
}

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

publicclassClassroomimplementsAggregate{
privateStudent[] students;
privateintlength=0;
privateintmaxSize;
publicClassroom(intmaxSize){
this.maxSize=maxSize;
students=newStudent[maxSize];
    }
publicStudentgetStudent(intindex){
returnstudents[index];
    }
publicbooleanaddStudent(Studentstudent){
if (length>=maxSize){
returnfalse;
        }
this.students[length]=student;
length++;
returntrue;
    }
publicintgetLength(){
returnthis.length;
    }
@OverridepublicIteratoriterator() {
returnnewClassroomIterator(this);
    }
}

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

publicclassClassroomIteratorimplementsIterator{
privateClassroomclassroom;
privateintindex;
publicClassroomIterator(Classroomclassroom){
this.classroom=classroom;
this.index=0;
    }
@OverridepublicbooleanhasNext() {
if (this.index<classroom.getLength()){
returntrue;
        }
returnfalse;
    }
@OverridepublicObjectnext() {
Studentstudent=classroom.getStudent(index);
index++;
returnstudent;
    }
}

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

publicstaticvoidmain(String[] args) {
Classroomclassroom=newClassroom(3);
classroom.addStudent(newStudent("张三"));
classroom.addStudent(newStudent("李四"));
classroom.addStudent(newStudent("王五"));
Iteratoriterator=classroom.iterator();
while (iterator.hasNext()){
Studentnext= (Student) iterator.next();
System.out.println(next.getName());
    }
}

(四)迭代器模式的作用


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


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


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


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


publicinterfaceIterator<E> {
booleanhasNext();
Enext();
defaultvoidremove() {
thrownewUnsupportedOperationException("remove");
    }
defaultvoidforEachRemaining(Consumer<?superE>action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
    }
}

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


网络异常,图片无法展示
|


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


(五)总结


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


相关文章
|
8月前
|
设计模式 C++ 容器
设计模式之迭代器模式(C++)
设计模式之迭代器模式(C++)
|
1月前
|
设计模式 算法 Java
【设计模式系列笔记】迭代器模式
迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。该模式通过定义一个迭代器接口,负责定义访问和遍历元素的方法,以及一个可迭代接口,负责返回迭代器的实例。
33 0
|
11月前
|
设计模式
设计模式——迭代器模式
设计模式——迭代器模式
138 36
|
1月前
|
设计模式 存储 算法
【设计模式】迭代器模式
【设计模式】迭代器模式
|
1月前
|
设计模式 Java
深入浅出迭代器模式
深入浅出迭代器模式
15 0
|
1月前
|
设计模式 算法 数据库
二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
|
8月前
|
设计模式 存储 算法
设计模式~迭代器模式(Iterator)-20
迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。迭代器模式已经被淘汰,java中已经把迭代器运用到各个聚集类(collection)中了,使用java自带的迭代器就已经满足我们的需求了 目录 迭代器模式(Iterator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项 (5)应用实例: 代码
43 0
|
10月前
|
设计模式 存储 Java
设计模式之迭代器模式
设计模式之迭代器模式
118 0
|
设计模式 消息中间件 存储
一起来学设计模式之迭代器模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式中的迭代器模式,并结合实际业务场景给大家讲解如何使用~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 迭代器模式 迭代器模式是一种设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不必了解该对象的内部结构。它将聚合对象和访问元素的方式分离开来,使得聚合对象的内部结构可以自由地改变,而不会影响客户端的访问方式。该模式提供了一种标准的方法来遍历一个聚合对象,而不需要了解该聚合对象的实现细节。
|
设计模式 Java API
设计模式学习(十):lterator迭代器模式
设计模式学习(十):lterator迭代器模式
134 0
设计模式学习(十):lterator迭代器模式