设计模式学习笔记:迭代器模式(Iterator)

虚心使人进步,骄傲使人落后。

一、迭代器模式介绍

迭代器模式属于设计模式中行为型模式的一种。迭代器模式提供了一种方法用于访问聚合对象中的各个元素,而又不暴露该对象的内部表示。

二、迭代器模式的优点

使用迭代器模式可以使得聚合对象中元素的聚合方式改变时,访问者不用修改访问的方式。

例如:聚合对象中元素的聚合方式由数组改为链表,如果不使用迭代器模式,那么访问者遍历聚合对象中元素的代码就要修改,如果使用迭代器模式,只需要修改对应的迭代器的方法就可以了,不用修改访问者的代码。

三、示例

有一个聚合对象班级(Class),班级中有很多学生(Student)。如果要访问班级里的所有学生,就可以使用迭代器方式实现。

迭代器模式类图

四、代码实现

Iterator(迭代器接口):

/**
 * 迭代器接口
 *
 * @author ZhengNC
 * @date 2020/9/9 22:40
 */
public interface Iterator<E> {

    /**
     * 是否有下一个元素
     *
     * @return
     */
    boolean hasNext();

    /**
     * 获取下一个元素
     *
     * @return
     */
    E next();
}

Class(班级):

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

/**
 * 班级
 *
 * @author ZhengNC
 * @date 2020/9/9 22:47
 */
public class Class {

    private List<Student> studentList = new ArrayList<>();

    /**
     * 添加学生
     *
     * @param student
     */
    public void addStudent(Student student){
        studentList.add(student);
    }

    /**
     * 移除学生
     *
     * @param student
     */
    public void removeStudent(Student student){
        studentList.remove(student);
    }

    /**
     * 获取学生迭代器
     *
     * @return
     */
    public Iterator<Student> iterator(){
        return new Itr();
    }


    /**
     * 学生迭代器
     */
    private class Itr implements Iterator<Student>{

        /**
         * 当前迭代下标
         */
        private int cursor;

        /**
         * 预期迭代数量
         */
        private int expectedSize = studentList.size();

        private Itr() {}

        @Override
        public boolean hasNext() {
            return cursor != expectedSize;
        }

        @Override
        public Student next() {
            checkExpectedSize();
            return studentList.get(cursor++);
        }

        /**
         * 检查预期迭代数量是否有变化
         */
        private void checkExpectedSize(){
            if (expectedSize != studentList.size()) {
                throw new ConcurrentModificationException();
            }
        }
    }
}

Student(学生):

/**
 * 学生
 *
 * @author ZhengNC
 * @date 2020/9/9 22:47
 */
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;
    }

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

TestIterator(测试迭代器模式):

/**
 * 测试迭代器模式
 *
 * @author ZhengNC
 * @date 2020/9/9 23:13
 */
public class TestIterator {

    public static void main(String[] args) {
        Class cla = new Class();
        cla.addStudent(new Student("张三"));
        cla.addStudent(new Student("李四"));
        cla.addStudent(new Student("王五"));
        cla.addStudent(new Student("赵六"));

        Iterator<Student> iterator = cla.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

五、代码执行结果

Student{name=‘张三’}
Student{name=‘李四’}
Student{name=‘王五’}
Student{name=‘赵六’}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值