首页 > 编程知识 正文

迭代器模式的环境,设计模式迭代器模式

时间:2023-05-03 09:47:09 阅读:143214 作者:2176

迭代器型0 .码仙感召力1 .概要2 .结构3 .案例实现4 .优缺点5 .使用场景6.JDK源代码分析

0 .码仙感动

一个人未来能去哪,不是靠想象,而是靠今天你都干了什么,干得怎么样。

1 .概述定义:

提供依次访问聚合对象中的一组数据的对象,而不暴露聚合对象的内部表示。

2 .结构迭代器模式主要包括以下作用:

抽象聚合角色:用于存储、添加或删除聚合元素以及创建迭代器对象的接口。

ConcreteAggregate角色:实现抽象聚合类并返回特定迭代器的实例。

抽象迭代器(Iterator )角色:定义用于访问和遍历聚合元素的接口。 通常包含hasNext )、next )等方法。

迭代器(Concretelterator )角色:实现抽象迭代器界面中定义的方法,完成对聚合对象的遍历,并记录遍历的当前位置。

3 .案例安装【例】定义可以容纳学生对象的容器对象,将遍历该容器的功能交给迭代器进行安装。 相关班级如下。

代码如下所示。

定义迭代器接口并声明hasNext、next方法

publicinterfacestudentiterator { boolean hasnext (; Student next (; }定义具体迭代器类,并重写所有抽象方法

publicclassstudentiteratorimplimplementsstudentiterator { privateliststudentlist; private int position=0; publicstudentiteratorimpl (liststudentlist ) { this.list=list; } @Override public boolean hasNext () { return position list.size ); } @Override public Student next () studentcurrentstudent=list.get (position ); 定位返回当前支撑; }定义抽象容器类,该类包含如何添加元素、删除元素和获取迭代器对象

publicinterfacestudentaggregate { voidaddstudent (student student ); voidremovestudent (student student; sudentiteratorgetstudentiterator (; }定义具体的容器类,并重写所有方法

publicclassstudentaggregateimplimplementsstudentaggregate { privateliststudentlist=newarrayliststudent; //学生名单@ overridepublicvoidaddstudent (student student ) this.list.add ) student; } @ overridepublicvoidremovestudent (student student ) this.list.remove ) student; } @ overridepublicstudentiteratorgetstudentiterator () returnnewstudentiteratorimpl (list ); }4.优缺点1,优点:

支持以不同的方式遍历单个聚合对象,并且可以在同一聚合对象上定义多种遍历方法。 在迭代器模式中,只需用不同的迭代器替换迭代器就可以更改迭代算法。 您还可以定义自己的迭代器子类以支持新的迭代方法。 迭代器简化了集成类。 通过引入迭代器,传统聚合对象不需要自己提供遍历数据等方法,从而简化了聚合类的设计。 迭代器模型引入了抽象层,因此添加新的聚合类和迭代器类非常方便,无需修改原始代码就可以满足“开闭原则”的要求。2,缺点:

增加了类的数量,在一定程度上增加了系统的复杂性。

5 .需要为使用场景的聚合对象提供多种遍历方法。 需要统一的接口来遍历不同的聚合结构。 访问聚合对象的内容而不公开内部详细表示。 6.JDK源代码解析迭代器模式在JAVA的许多集合类中广泛使用。 接下来,我们来看看在JAVA源代码中如何使用迭代器模式。

ListString list=

new ArrayList<>();Iterator<String> iterator = list.iterator(); //list.iterator()方法返回的肯定是Iterator接口的子实现类对象while (iterator.hasNext()) { System.out.println(iterator.next());}

看完这段代码是不是很熟悉,与我们上面代码基本类似。单列集合都使用到了迭代器,我们以ArrayList举例来说明

List:抽象聚合类ArrayList:具体的聚合类Iterator:抽象迭代器list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

具体的来看看 ArrayList的代码实现

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { int cursor; // 下一个要返回元素的索引 int lastRet = -1; // 上一个返回元素的索引 int expectedModCount = modCount; Itr() {} //判断是否还有元素 public boolean hasNext() { return cursor != size; } //获取下一个元素 public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } ...}

这部分代码还是比较简单,大致就是在 iterator 方法中返回了一个实例化的 Iterator 对象。Itr是一个内部类,它实现了 Iterator 接口并重写了其中的抽象方法。

注意:

​ 当我们在使用JAVA开发的时候,想使用迭代器模式的话,只要让我们自己定义的容器类实现java.util.Iterable并实现其中的iterator()方法使其返回一个 java.util.Iterator 的实现类就可以了。

本篇博客来自于黑马程序员视频教程的总结以及笔记的整理,仅供学习交流,切勿用于商业用途,如有侵权,请联系博主删除,博主QQ:194760901

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