您的位置:首页 > 其它

设计模式系列12---遍历统一的迭代模式

2016-01-03 21:26 288 查看


对于迭代这件事,我们曾经遇到过很多类似的事情,

例如:上课点名!!!

每次我们的课室
存储
了一堆的
学生对象
,然后老师开始
迭代名单
–点名,

判断某学生是否来上课了,没来的平时分给你扣点,积少成多,考试就压力大了。

大学时代满满的回忆啊。

代码实现

看了这么一个简单的案例故事,我们该怎么用代码实现呢?

首先我们来定义下我们的课室,我们的课室储存了很多的学生小朋友。

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也确实给我们提供了很多的实现版本了。基本常用的数据结构都有了,除非我们自己去写一些别的特殊的结构才会需要用到,最少到目前为止我没在自己的实际项目中写过,除了为了练习这个模式之外。

当然也可能是我
见少识窄
,做的项目还没到那个层次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 迭代 遍历