大话设计模式学习笔记(20)——迭代器模式

源码git地址 https://github.com/dlovetco/designMode
其实迭代器模式说出来很简单,就是在java语言中的foreach遍历。只不过我们平时在用不会去深究foreach的内部算法,现在我们来自己手写一下遍历。

问题提出

体育老师让小明数一下有多少个同学来上体育课了。

package iteratorMode;

import java.util.ArrayList;
import java.util.List;

public class IteratorMode {
    public static void main(String[] args) {
        StudentAggregate studentAggregate = new StudentAggregate();//创建学生集合
        Iterator iterator = studentAggregate.createIterator();//创建迭代器
        studentAggregate.addStudent(new Student("小红"));
        studentAggregate.addStudent(new Student("小刚"));
        studentAggregate.addStudent(new Student("小明"));
        System.out.println(studentAggregate);
        System.out.println("迭代器开始遍历");
        System.out.println(iterator.first());
        while (iterator.hasNext()) {
            iterator.next();
            System.out.println(iterator.currentItem());
        }
    }
}

interface Iterator {
    Object next();

    Object first();

    boolean hasNext();

    Object currentItem();

}

class StudentIterator implements Iterator {
    private StudentAggregate studentAggregate;

    private int current = 0;

    public StudentIterator(StudentAggregate studentAggregate) {
        this.studentAggregate = studentAggregate;
    }

    @Override
    public Student next() {
        if (hasNext()) {
            return studentAggregate.getStudent(++current);
        }
        return null;
    }

    @Override
    public Student first() {
        if (studentAggregate != null && studentAggregate.size() > 0) {
            return studentAggregate.getStudent(0);
        }
        return null;
    }

    @Override
    public boolean hasNext() {
        return studentAggregate != null && studentAggregate.size() > 0 && studentAggregate.size() - current > 1;
    }

    @Override
    public Object currentItem() {
        return studentAggregate.getStudent(current);
    }
}

/**
 * 集合类的抽象接口
 */
interface Aggregate {
    Iterator createIterator();
}

/**
 * 表示学生的集合
 */
class StudentAggregate implements Aggregate {
    private List<Student> students = new ArrayList<>();

    public void addStudent(Student student) {
        students.add(student);
    }

    public Student getStudent(int index) {
        return students.get(index);
    }

    @Override
    public Iterator createIterator() {
        return new StudentIterator(this);
    }

    public int size() {
        return students.size();
    }

    @Override
    public String toString() {
        return "StudentAggregate{" +
                "students=" + students +
                '}';
    }
}

/**
 * 学生个体
 */
class Student {
    public Student(String name) {
        this.name = name;
    }

    private String name;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}

输出:
StudentAggregate{students=[Student{name=’小红’}, Student{name=’小刚’}, Student{name=’小明’}]}
迭代器开始遍历
Student{name=’小红’}
Student{name=’小刚’}
Student{name=’小明’}

可以看到我们自己手写实现的迭代器成功的遍历了集合中所有对象。

plantuml

@startuml
interface Iterator{
{abstract}next();
{abstract}first();
{abstract}hasNext();
{abstract}currentItem();
}
Iterator <|.. StudentIterator
StudentIterator <.. StudentAggregate
class StudentIterator{
next();
first();
hasNext();
currentItem();
}

Iterator <-- Aggregate
interface Aggregate{
{abatract}Iterator createIterator()
}
Aggregate <|.. StudentAggregate
StudentAggregate <-- StudentIterator
class StudentAggregate{
List<Student> students
}
Student <..* StudentAggregate
class Student{
name
}
@enduml

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值