谁的青春不军训? 教官用了Iterator Pattern都说好
目的
不需要知道具体的数据存储方式对数据进行不同方式的遍历
例子代码
最近考答(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都说好相关推荐
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...
- 初涉c#设计模式-Iterator Pattern
一.迭代器模式简介(Brief Introduction) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示. Provide a ...
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- 设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构.
- C#设计模式:迭代器模式(Iterator Pattern)
一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...
- 迭代器模式(Iterator pattern)
一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); w ...
- 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> dotnet或java里 ...
- .NET设计模式(18):迭代器模式(Iterator Pattern)(转)
概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...
- 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
1 package com.tn.pattern; 2 3 public class Client { 4 public static void main(String[] args) { 5 Obj ...
最新文章
- 41.虚拟存储器以及相关算法
- 定积分计算器_使用科学计算器计算概率分布
- 团队管理---如何管理好团队
- 零基础适合学python吗-零基础,经济学专业,适合自学Python吗?
- [投稿]Speex回声消除代码分析
- SQL导入/导出Excel
- [Reinforcement Learning] 动态规划(Planning)
- c语言常用例子,C语言经典例子100个
- html完全自学手册,完全自学手册PHP+Ajax(PPT) 第3章 HTML基础.ppt
- 更换帝国cms默认文章内容编辑器fckeditor
- makefile 目标:依赖文件写法
- 财报汇总 | 中国生物制药、格林酒店、海亮教育、洪恩教育等5家企业公布最新业绩...
- pool(六)——JedisPool
- 哈啰电动车“智慧门店”设想,经销商们买账吗?
- DELL H61刷BIOS开启AHCI
- 为什么需要稀疏编码及解释
- Jasper Report 6.8 根据后台数据生成动态报表(JRXML文件实现)(二)生成XML文件(支持json,bean,map list数据源)
- FIN_WAIT_2的超时时间
- 英语天天秀(2007/06/16) -- 老美口头禅
- 1.java概述与环境搭建