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

enter image description here

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

例如:上课点名!!!

每次我们的课室存储了一堆的学生对象,然后老师开始迭代名单–点名,
判断某学生是否来上课了,没来的平时分给你扣点,积少成多,考试就压力大了。

大学时代满满的回忆啊。

代码实现

看了这么一个简单的案例故事,我们该怎么用代码实现呢?
首先我们来定义下我们的课室,我们的课室储存了很多的学生小朋友。

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());
        }

    }
}

类图

enter image description here
其实我们的这个迭代器模式还是简单易懂的,特别是我们已经用了很多了。

后记

对于迭代模型,他的功效就是统一了我们对内部对象的访问,让我们可以顺序的访问一个聚合对象中各个元素,而又不用知道它具体内部到底怎么实现的。

例如:如果内部用的是堆,数组,树等结构,很显然如果我们要从头到尾都遍历一次,必须采用不同的遍历方案,但使用迭代模型可以帮助我们忽略所有细节。我们只需要看下是否有还有内容,有则取出来。

个人感觉,很多项目中不会自己去写迭代模型了,很多时候都是调用JAVA封装好的了,而且我们的java也确实给我们提供了很多的实现版本了。基本常用的数据结构都有了,除非我们自己去写一些别的特殊的结构才会需要用到,最少到目前为止我没在自己的实际项目中写过,除了为了练习这个模式之外。
当然也可能是我见少识窄,做的项目还没到那个层次。

热评文章