什么是迭代器模式
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式又称为游标模式,迭代器模式是一个元老级别的设计模式,针对容器的访问,我们java中要设计遍历算法,迭代器算是客户端与系统之间的第三者,方便遍历应运而生。

迭代器模式的适用场景
遍历容器内对象

迭代器模式用例
好比我们高校Java专业有两个班级JavaOne和JavaTwo,辅导员想要获取所有学生的姓名、年龄、性别的信息,最笨的方法是导员自己一个一个去问。但是导员比较忙,所以是时候体现班长的作用了,班长就是具体的迭代器类,班长自己去一个一个统计,然后把数据罗列出来,然后两个班长把数据统一交给辅导员,辅导员只需要调用班长的类就可以实现遍历所有学生的信息。

UML类图

Student实体类:

public class Student {private String name;private String sex;private int age;public Student(String name,String sex,int age){this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//自定义覆写toString方法实现public String toString(){return "姓名:"+name+"  性别:"+sex+"  年龄:"+age;}
}

Iterator接口:

public interface Iterator {boolean hasNext();Object next();
}

Iterator实现类:(一班班长遍历算法,一班班长用了list存储数据)

public class ClassOneIterator implements Iterator {private List<Student> list;private int position;public ClassOneIterator(List<Student> list){this.list = list;}@Overridepublic boolean hasNext() {return !(position > list.size() - 1 || list.get(position) == null);}@Overridepublic Object next() {Student stu = list.get(position);position++;return stu;}}

Iterator接口实现类:(二班班长遍历算法,二班班长用了数组)

public class ClassTwoIterator implements Iterator {private Student[] array;private int position;public ClassTwoIterator(Student[] array){this.array = array;}@Overridepublic boolean hasNext() {return !(position > array.length - 1 || array[position] == null);}@Overridepublic Object next() {Student stu = array[position];position++;return stu;}}

接口ClassJava实现:(班长需要遍历操作)

public interface ClassJava {Iterator iterator();
}

ClassJava接口实现类:ClassOne(一班班长统计的数据)

public class ClassOne implements ClassJava {private List<Student> list = new ArrayList<>();public ClassOne(){list.add(new Student("张三","男",23));list.add(new Student("李四","女",19));list.add(new Student("王五","男",26));list.add(new Student("赵六","女",18));}@Overridepublic Iterator iterator() {return new ClassOneIterator(list);}}

ClassJava接口实现类:ClassTwo(二班班长统计的数据)

public class ClassTwo implements ClassJava {private Student[] array = new Student[5];public ClassTwo(){array[0] = new Student("小王","男",23);array[1] = new Student("小李","女",29);array[2] = new Student("小能","男",23);array[3] = new Student("小六","男",19);array[4] = new Student("小五","女",22);}@Overridepublic Iterator iterator() {return new ClassTwoIterator(array);}}

辅导员综合查看数据:测试类

public class Test {public static void main(String[] args) {//让一班班长去统计一般信息并报告结果ClassOne one = new ClassOne();getStudentInfo(one.iterator());//让二班班长去统计二班信息并报告结果ClassTwo two = new ClassTwo();getStudentInfo(two.iterator());}private static void getStudentInfo(Iterator iterator){while(iterator.hasNext()){System.out.println(iterator.next().toString());}}}

运行结果:

姓名:张三  性别:男  年龄:23
姓名:李四  性别:女  年龄:19
姓名:王五  性别:男  年龄:26
姓名:赵六  性别:女  年龄:18
姓名:小王  性别:男  年龄:23
姓名:小李  性别:女  年龄:29
姓名:小能  性别:男  年龄:23
姓名:小六  性别:男  年龄:19
姓名:小五  性别:女  年龄:22

以上是我们自定义的迭代器,而jdk内置也有迭代器,与之不同的是他设计的更完善。迭代器和for循环都可以完成遍历操作,区别在于for循环遍历过程中不能更改容器的大小,而迭代器则可以通过remove()方法来更改容器大小;效率上for循环适合随机访问比如Arraylist,而迭代器适合顺序访问比如LinkedList。因为for循环使用下标来获取元素位置,而迭代器通过next(),pre()来定位元素,可以访问无序结构。所以如果需要迁移数据到set这种无序的结构的话,for循环要调整迭代器无需调整。

迭代器模式总结
优点:弱化了容器类与遍历算法之间的关系
缺点:类文件增加
对各种语言来说,迭代器已经开发的相当完善了,所以对于开发者而言不需要自己去动手实现太多,当然如果的确有需要的话。

迭代器模式--更高、更快、更强(行为模式09)相关推荐

  1. 精度更高,视野更大的Photoneo3D相机

    如今3D视觉在工厂应用方面越来越广泛,机床上下料,拆码垛,无序抓取,更多的应用到了3D视觉,photoneo作为一款精度高,视野大的进口3D相机,在3D视觉行业已经占据了越来越多的市场. Photon ...

  2. 技术更高,设计更远:华为全屋智能设计大赛的审美之跃

    "人生到处知何以?应似飞鸿踏雪泥.泥上偶然留指爪,鸿飞那复计东西." 很多设计师朋友跟我说,苏轼这首<和子由渑池怀旧>是对设计与审美的最高理解.好的设计,应该仅仅留下一 ...

  3. Java应该是更高级别还是更低级别?

    总览 Java 8带来了许多简化的功能,例如Lambda表达式, 类型注释和虚拟扩展 . 尽管此功能很重要:a)有价值,b)赶上较凉的语言,但是这些更丰富,更高级的功能是Java应当重点关注的领域. ...

  4. java好还是python好-Python和Java哪个薪资更高、远景更好?

    运用Python的人越来越多,为啥?人工智能浪潮的兴起与TensorFlow以及爬虫结构的普及让Python有了用武之地:大数据与云计算解决方案的运用也为Python的成功猛推了一把.作为数据科学最盛 ...

  5. python和java哪个好-Python和Java哪个薪资更高、远景更好?

    运用Python的人越来越多,为啥?人工智能浪潮的兴起与TensorFlow以及爬虫结构的普及让Python有了用武之地:大数据与云计算解决方案的运用也为Python的成功猛推了一把.作为数据科学最盛 ...

  6. CVPR 2021 | Facebook提出FP-NAS:搜索速度更快、分类精度更高、性能更好

    作者|严志程 来源|机器之心 来自 Facebook AI 的严志程团队发表一种新的神经架构的快速搜索算法.该算法采用自适应架构概率分布熵的架构采样,能够减少采样样本达 60%,加速搜索快 1.8 倍 ...

  7. 哈趣K1和哈趣H1哪个性价比更高?谁更值得入手?

    哈趣投影作为一个新兴的品牌,今年初3月推出了哈趣H1第一款产品,复古的外观以及高性价比让它小小出圈,成为千元价位中年轻消费群体的新宠.6月,哈趣再出一款新品--哈趣K1,有很多小伙伴问了,这两款的区别 ...

  8. 新一代TMC2240芯片性能更高,功能更齐全

    Trinamic推出的新一代TMC2240智能高性能步进电机驱动IC,集成了更多的功能,是tmc2209/tmc2130的升级版!高集成度.高能效和小的外形,使小型化和可伸缩的系统成为具有成本效益的解 ...

  9. Meta Quest Pro拆解:集成度更高,设计更复杂

    作为专注于数码产品拆解的社区,iFixit不仅仅首发iPhone.iPad拆解,同时也参与了不少VR.AR项目,例如Valve Index.PS VR.HoloLens 2.Magic Leap 1等 ...

  10. java下拉菜单_Web前端和Java开发哪个薪资更高,发展前景更好?

    互联网行业飞速发展,因此有很多小伙伴想要进入IT行业分一杯羹,但是学什么技术更好,哪一个语言的就业薪资更高,就成了困惑大家的主要问题. 网上关于"Web前端和Java开发谁的薪资高,发展前景 ...

最新文章

  1. 不需要借助GPU的力量,用树莓派也能实时训练agent玩Atari
  2. 005_系统运维之SLA与SLO的关系
  3. 木棍分割[HAOI2008]
  4. linux查看目录大小
  5. 最大熵学习笔记(六)优缺点分析
  6. 带你反编译APP然后重新打包「MacOS」
  7. EcmaScript对象克隆之谜
  8. 个人管理 - Learn More,Study Less!
  9. bzoj 3232: 圈地游戏【分数规划+最小割】
  10. csv 读写 python_Python CSV读写
  11. C++字符串格式化 sprintf详解
  12. 最常用的前端网站模板集合
  13. Fall 2020 Berkeley cs61a hw03答案
  14. WAV音乐文件无法修改标题
  15. LeetCode-75. 颜色分类(荷兰国旗问题)
  16. 后缀自动机(知识整理+板子总结)
  17. 惊了,近4成年薪50W+商科TOP1院校的生源都有哪些? | 北大光华2022级推免大数据
  18. 判断当前是移动端还是PC端 判断是微信浏览器还是非微信浏览器
  19. 计算机控制总端,楼宇计算机控制系统(DCS)
  20. P6专题:P6 EPPM和PPM基本概念

热门文章

  1. 视频去水印软件哪个好用?
  2. 【云栖大会】阿里巴巴成立“达摩院” 引入顶尖科学家3年研发投入将超千亿
  3. java.security Cipher 对象详细介绍
  4. 磁盘分区类型和分区表的区别
  5. python launcher下载,python launcher是什么 python的launcher用法知识点总结
  6. @Value的诸多用法
  7. CPU性能测试基准(EEMBC-CoreMark)
  8. 达梦数据库(DM8)常用功能总结-图形化界面
  9. VC++ MFC资源中添加PNG,JPG等图片资源
  10. 写大论文的一些注意事项