首页 > 编程知识 正文

设计模式迭代器模式,迭代器模式类图

时间:2023-05-05 03:03:34 阅读:143224 作者:4895

这篇文章收录在JavaStarter中,包含了我完整的Java系列文章。 既可以学习也可以面试

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

for(intI=0; iarr.length; I ) system.out.print(arr[I]; }上面的代码通过一个循环添加arr的下标,实现了遍历数组的功能。

但是,为了实现循环遍历,由于依赖于集合对象内部,所以存在不依赖于对象内部的表现,可以依次访问集合对象内的各个要素的设计模式迭代器模式。

(二)迭代器型角色迭代器型角色主要有四种:

1,http://www.Sina.com/(iterator ) :用于定义对集合元素的访问和遍历的接口,一般为next ) )、hasNext )方法。

2、http://www.Sina.com/(concrete iterator ) :是实现迭代器接口的角色,迭代器的核心路径逻辑在此实现。

3、3358www.Sina.com/(aggregate ) :集合接口定义了创建迭代器的接口方法,内部定义了迭代器方法。

4、http://www.Sina.com/(concrete aggregate ) :此角色用于实现集合接口,他创建具体的迭代器角色。

看到这里疑问的话就没关系了。 用代码加深理解。

(三)迭代器代码实现首先描述该代码的场景,定义教室的班级,并定义学生的班级,实现遍历教室中学生的功能。

代码列表如下所示。

interface Aggregate :集合接口interface Iterator :迭代器接口class Classroom :教室类,实现集合接口的具体集合class ClassroomIterator

publicinterfaceaggregate { iterator iterator (; } publicinterfaceiterator { boolean hasnext (; Object next (; }然后定义学生班级:

@ data @ allargsconstructorpublicclassstudent { privatestring name; }然后,定义教室班级。 教室类定义了Student集合以及当前集合的长度和最大长度。 同时实现聚合接口的迭代器方法。 此方法返回迭代器的对象。 此迭代器的对象由类迭代器提供

publicclassclassroomimplementsaggregate { privatestudent [ ] students; private int length=0; 私有最大; publicclassroom(intmaxsize ) { this.maxSize=maxSize; students=new Student[maxSize]; } publicstudentgetstudent (intindex ) { return students[index]; } publicbooleanaddstudent (student student ) if ) length=maxsize ) { return false; } this.students[length]=student; 长度; 返回真; } public int getLength () { return this.length; } @ overridepubliciteratoriterator () returnnewclassroomiterator ) (this ); }最后是ClassroomIterator对象。 classroom迭代器是迭代器的具体实现,在此处必须实现hasNext和next方法

publicclassclassroomiteratorimplementsiterator { privateclassroomclassroom; 私有索引; publicclassroomiterator (classroom classroom ) { this.classroom=classroom; this.index=0; } @Override public boolean hasNext (

if (this.index<classroom.getLength()){ return true; } return false; } @Override public Object next() { Student student = classroom.getStudent(index); index++; return student; }}

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

public static void main(String[] args) { Classroom classroom=new Classroom(3); classroom.addStudent(new Student("zjdtd")); classroom.addStudent(new Student("dcdhm")); classroom.addStudent(new Student("mmdcdq")); 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<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); }}

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

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

(五)总结

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。