目的

不需要知道具体的数据存储方式对数据进行不同方式的遍历

例子代码

最近考答(so)题(suo) 获得了 10.24 元狗物券, 猛地想起抹茶妹妹不知道怎么样了, 兄弟告诉我 不努力就不是我兄弟 现在只要学习设计模式学的好, 女朋友就还在初中军训

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UzMDvDiN-1602385220804)(/assets/2019110100.png)]

比如我们有一个军训方队, 每天要点名, 这时候我们实现了如下代码:

先定义一个学生类:

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

我们需要按照从左到右的顺序进行报名:

public static final void printAllName(List<List<Student>> students) {for (List<Student> studentList : students) {for (Student student : studentList) {System.out.println(student.getName());}}
}

我们试验一下:

List<List<Student>> students = new ArrayList<>(16);
for (int i = 0; i < 10; i++) {students.add(Arrays.asList(new Student("朱坚强" + i, true),new Student("兰兰" + i, false),new Student("codog编程狗" + i, true)));
}
printAllName(students);

问题分析

这个代码我们认为有二处可能有隐患的地方: 一处是我们存储学生队列的这个结构(list<list>) 可能会改变, 另外一处是我们目前只支出从左到右访问, 如果有新的遍历要求我们就需要更新大量的上层代码, 我们写完了这个代码, 想要回家陪(da)老(fei)婆(ji), 结果走到半路上, 被叫着改了二个需求, 一个是把 list<list> 改成二维数据方式存储, 另外一个是需要队列中的女生单独报, 男生不报名了, 这时候我们说 printAllName 这个方法用了1万处了, 需要逐个改

迭代器模式

先定义一个学生队列类:

@Data
@AllArgsConstructor
public class StudentLineUp {private List<List<Student>> students;
}

定义一个迭代器:

public class LineUpIterator implements Iterator<Student> {private StudentLineUp studentLineUp;private Integer totalCount;private Integer currentRow;private Integer currentCol;private Integer currentCount;public LineUpIterator(StudentLineUp studentLineUp) {this.studentLineUp = studentLineUp;this.totalCount = studentLineUp.getStudents().stream().map(list -> list.size()).reduce(Integer::sum).get();this.currentRow = 0;this.currentCol = 0;this.currentCount = 0;}@Overridepublic boolean hasNext() {return currentCount.compareTo(totalCount) < 0;}@Overridepublic Student next() {if(!hasNext()) {throw new RuntimeException("没有下一个数据了");}if(studentLineUp.getStudents().get(currentRow).size() <= currentCol) {currentRow++;currentCol = 0;}currentCount++;return studentLineUp.getStudents().get(currentRow).get(currentCol++);}
}

实际使用:

List<List<Student>> students = new ArrayList<>(16);
for (int i = 0; i < 10; i++) {students.add(Arrays.asList(new Student("朱坚强" + i, true),new Student("兰兰" + i, false),new Student("codog编程狗" + i, true)));
}
LineUpIterator lineUpIterator =
new LineUpIterator(new StudentLineUp(students));
while (lineUpIterator.hasNext()) {System.out.println(lineUpIterator.next().getName());
}

更进一步

如果我们变化的维度减少一个, 比如说是这个遍历方式基本不变, 但是内部存储方式可能会变, 那我们可以对数据结构采用 Iterable 方式:

@Data
@AllArgsConstructor
public class StudentLineUp implements Iterable<Student> {private List<List<Student>> students;@Overridepublic Iterator<Student> iterator() {return new LineUpIterator(this);}
}

使用方式:

List<List<Student>> students = new ArrayList<>(15);
for (int i = 0; i < 10; i++) {students.add(Arrays.asList(new Student("朱坚强" + i, true),new Student("兰兰" + i, false),new Student("codog编程狗" + i, true)));
}
for (Student student : new StudentLineUp(students)) {System.out.println(student.getName());
}

类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFFNT5xO-1602385220807)(/assets/2019110101.png)]
微信:

谁的青春不军训? 教官用了Iterator Pattern都说好相关推荐

  1. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  2. 初涉c#设计模式-Iterator Pattern

    一.迭代器模式简介(Brief Introduction) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示. Provide a ...

  3. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

  4. 设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构.

  5. C#设计模式:迭代器模式(Iterator Pattern)

    一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...

  6. 迭代器模式(Iterator pattern)

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...

  7. 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> dotnet或java里 ...

  8. .NET设计模式(18):迭代器模式(Iterator Pattern)(转)

    概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...

  9. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern

    1 package com.tn.pattern; 2 3 public class Client { 4 public static void main(String[] args) { 5 Obj ...

最新文章

  1. 41.虚拟存储器以及相关算法
  2. 定积分计算器_使用科学计算器计算概率分布
  3. 团队管理---如何管理好团队
  4. 零基础适合学python吗-零基础,经济学专业,适合自学Python吗?
  5. [投稿]Speex回声消除代码分析
  6. SQL导入/导出Excel
  7. [Reinforcement Learning] 动态规划(Planning)
  8. c语言常用例子,C语言经典例子100个
  9. html完全自学手册,完全自学手册PHP+Ajax(PPT) 第3章 HTML基础.ppt
  10. 更换帝国cms默认文章内容编辑器fckeditor
  11. makefile 目标:依赖文件写法
  12. 财报汇总 | 中国生物制药、格林酒店、海亮教育、洪恩教育等5家企业公布最新业绩...
  13. pool(六)——JedisPool
  14. 哈啰电动车“智慧门店”设想,经销商们买账吗?
  15. DELL H61刷BIOS开启AHCI
  16. 为什么需要稀疏编码及解释
  17. Jasper Report 6.8 根据后台数据生成动态报表(JRXML文件实现)(二)生成XML文件(支持json,bean,map list数据源)
  18. FIN_WAIT_2的超时时间
  19. 英语天天秀(2007/06/16) -- 老美口头禅
  20. 1.java概述与环境搭建

热门文章

  1. 【算法】求非空子集的三种思路
  2. 看Python应乎潮流的72变
  3. elastic APM 深入测试 一 (无嵌套调用的分布式微服务监控)
  4. 初识C语言,一起迈入编程世界的大门
  5. 为什么计算机键盘用不了怎么办,笔记本电脑键盘用不了怎么办
  6. AWS助初创企业扬帆远航
  7. [渝粤教育] 中国地质大学 人力资源开发与管理 复习题 (2)
  8. 最完整的dos命令字典,IIS服务命令,FTP命令
  9. C语言:A+B的几种实现方式
  10. vagrant 修改配置文件后,window 系统报错 0x80004005