【设计模式】行为型模式4——迭代器模式

迭代器模式类图
优点
迭代器模式分离了容器对象的遍历操作,符合单一职责原则

缺点
每个具体容器需要添加一个对应的迭代器

/**
 * 角色(Object)
 */
public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 角色(Aggregate)
 */
public abstract class School {

    public abstract Iterator createIterator();

    public abstract void add(String studentName);
}

迭代器与容器共用相同数据结构,且有一一对应关系,参照Collection源码写成内部类

public class PrimarySchool extends School{

    private Student[] students;
    private int addIndex;
    private int index;

    public PrimarySchool() {
        addIndex = 0;
        index = 0;
        this.students = new Student[5];
    }

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

    @Override
    public void add(String studentName) {
        students[this.addIndex++] = new Student(studentName);
    }

    public class PrimarySchoolIterator implements Iterator{

        @Override
        public boolean hasNext() {
            if(students == null || index >= students.length){
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            return students[index++];
        }
    }
}



public class HighSchool extends School{

    private List<Student> students;
    private int index;

    public HighSchool() {
        index = 0;
        this.students = new ArrayList<>();
    }

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

    @Override
    public void add(String studentName) {
        students.add(new Student(studentName));
    }

    public class HighSchoolIterator implements Iterator{

        @Override
        public boolean hasNext() {
            if(students == null || index >= students.size()){
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            return students.get(index++);
        }
    }
}

测试类

    public static void main(String[] args) {
        PrimarySchool primarySchool = new PrimarySchool();
        primarySchool.add("小学生1");
        primarySchool.add("小学生2");
        primarySchool.add("小学生3");
        primarySchool.add("小学生4");
        primarySchool.add("小学生5");

        Iterator primarySchoolIterator = primarySchool.createIterator();
        System.out.println("=============================小学学生============================");
        while(primarySchoolIterator.hasNext()){
            Student next = (Student) primarySchoolIterator.next();
            System.out.println(next.getName());
        }


        HighSchool highSchool = new HighSchool();
        highSchool.add("高中生a");
        highSchool.add("高中生b");
        highSchool.add("高中生c");
        highSchool.add("高中生d");
        highSchool.add("高中生e");
        Iterator highSchoolIterator = highSchool.createIterator();
        System.out.println("=============================高中学生============================");
        while(highSchoolIterator.hasNext()){
            Student next = (Student) highSchoolIterator.next();
            System.out.println(next.getName());
        }


    }

结果
迭代器结果

jdk补充

实际上for-each语法糖背后对集合使用的便是迭代器方法,而对数组使用的就是fori循环
但倘若在遍历之时对其使用remove()则会因为实际引用与集合变化的原因使遍历异常,问题具体描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值