对于迭代这件事,我们曾经遇到过很多类似的事情,
例如:上课点名!!!
每次我们的课室存储
了一堆的学生对象
,然后老师开始迭代名单
–点名,
判断某学生是否来上课了,没来的平时分给你扣点,积少成多,考试就压力大了。
大学时代满满的回忆啊。
代码实现
看了这么一个简单的案例故事,我们该怎么用代码实现呢?
首先我们来定义下我们的课室,我们的课室储存了很多的学生小朋友。
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());
}
}
}
类图
其实我们的这个迭代器模式还是简单易懂的,特别是我们已经用了很多了。
后记
对于迭代模型,他的功效就是统一了我们对内部对象的访问,让我们可以顺序的访问一个聚合对象中各个元素,而又不用知道它具体内部到底怎么实现的。
例如:如果内部用的是堆,数组,树等结构,很显然如果我们要从头到尾都遍历一次,必须采用不同的遍历方案,但使用迭代模型可以帮助我们忽略所有细节。我们只需要看下是否有还有内容,有则取出来。
个人感觉,很多项目中不会自己去写迭代模型了,很多时候都是调用JAVA封装好的了,而且我们的java也确实给我们提供了很多的实现版本了。基本常用的数据结构都有了,除非我们自己去写一些别的特殊的结构才会需要用到,最少到目前为止我没在自己的实际项目中写过,除了为了练习这个模式之外。
当然也可能是我见少识窄
,做的项目还没到那个层次。