设计模式系列12---遍历统一的迭代模式
2016-01-03 21:26
288 查看
![](http://7xl9zd.com1.z0.glb.clouddn.com/W020141211406589017323.jpg)
对于迭代这件事,我们曾经遇到过很多类似的事情,
例如:上课点名!!!
每次我们的课室
存储了一堆的
学生对象,然后老师开始
迭代名单–点名,
判断某学生是否来上课了,没来的平时分给你扣点,积少成多,考试就压力大了。
大学时代满满的回忆啊。
代码实现
看了这么一个简单的案例故事,我们该怎么用代码实现呢?首先我们来定义下我们的课室,我们的课室储存了很多的学生小朋友。
public class ClassRoom<T> implements Aggregate<T> { private List<T> studentList = new ArrayList<>(); @Override public void addStudent(T student) { studentList.add(student); } @Override public void removeStudent(T absentStudent) { studentList.remove(absentStudent); } @Override public StudentIterator<T> iterator() { return new StudentIterator<>(studentList); } } public interface Aggregate<T> { void addStudent(T student); void removeStudent(T absentStudent); StudentIterator<T> iterator(); }
这个课室可以有学生进来
addStudent,也有学生翘课跑的
removeStudent,然后还可以给我们的老师去遍历学生的功能
iterator。
接着我们来看下我们的学生遍历神器
StudentIterator
public class StudentIterator<T> implements Iterator<T> { private List<T> studentList = new ArrayList<>(); private int cursor = 0; public StudentIterator(List<T> studentList) { this.studentList = studentList; } @Override public boolean hasNext() { return studentList != null && cursor != studentList.size(); } @Override public T next() { return hasNext() ? studentList.get(cursor++) : null; } @Override public void remove() { throw new UnsupportedOperationException(); } }
这个学生遍历神器很简单,就是实现我们
Java已经定义好的接口
Iterator。
在上面这些都准备好了后,我们是时候请出我们的
老师了,由他来负责点名了!
public class Teacher { public static void main(String[] args) { ClassRoom<String> classRoom = new ClassRoom<>(); classRoom.addStudent("jack"); classRoom.addStudent("tom"); classRoom.addStudent("rose"); StudentIterator iterator = classRoom.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
类图
![](http://7xl9zd.com1.z0.glb.clouddn.com/%E5%82%B2%E6%B8%B8%E6%88%AA%E5%9B%BE20160103211346.jpg)
其实我们的这个迭代器模式还是简单易懂的,特别是我们已经用了很多了。
后记
对于迭代模型,他的功效就是统一了我们对内部对象的访问,让我们可以顺序的访问一个聚合对象中各个元素,而又不用知道它具体内部到底怎么实现的。例如:如果内部用的是堆,数组,树等结构,很显然如果我们要从头到尾都遍历一次,必须采用不同的遍历方案,但使用迭代模型可以帮助我们忽略所有细节。我们只需要看下是否有还有内容,有则取出来。
个人感觉,很多项目中不会自己去写迭代模型了,很多时候都是调用JAVA封装好的了,而且我们的java也确实给我们提供了很多的实现版本了。基本常用的数据结构都有了,除非我们自己去写一些别的特殊的结构才会需要用到,最少到目前为止我没在自己的实际项目中写过,除了为了练习这个模式之外。
当然也可能是我
见少识窄,做的项目还没到那个层次。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式