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

发布时间:2023年12月18日

设计模式--行为型--迭代器模式

迭代器模式

定义

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

结构

  • 抽象聚合角色(Aggregate):定义存储、添加、删除聚合元素以及创建迭代器对象的接口
  • 具体聚合角色(Concrete Aggregate):实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器角色(Iterator):定义访问和遍历聚合元素的接口,通常包含hasNext() next()等方法。
  • 具体迭代器(Concrete Iterator):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

案例

定义一个可以存储学生对象的容器对象,将遍历该容器的功能交由迭代器实现。
类图:

在这里插入图片描述

/**
 * 抽象迭代器接口
 */
public interface StudentIterator {

    // 判读是否还有元素
    boolean hasNext();
    // 获取下一个元素
    Student next();
}
/**
 * 具体迭代器
 */
public class StudentIteratorImpl implements StudentIterator{

    private List<Student> list;
    // 用来记录遍历时的位置
    private int position = 0;

    public StudentIteratorImpl(List<Student> list) {
        this.list = list;
    }


    @Override
    public boolean hasNext() {
        return position < list.size();
    }

    @Override
    public Student next() {
        // 从集合中获取指定位置的元素
        Student currentStudent = list.get(position);
        position++;
        return currentStudent;
    }
}
/**
 * 抽象聚合接口
 */
public interface StudentAggregate {

    // 添加
    void addStudent(Student student);
    // 删除
    void removerStudent(Student student);
    // 获取迭代器对象
    StudentIterator getStudentIterator();
}
public class StudentAggregateImpl implements StudentAggregate{

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

    public StudentAggregateImpl() {
    }

    public StudentAggregateImpl(List<Student> list) {
        this.list = list;
    }

    @Override
    public void addStudent(Student student) {
        list.add(student);
    }

    @Override
    public void removerStudent(Student student) {
        list.remove(student);
    }

    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}
public class Student {
    private String name;
    private String number;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

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

    public Student() {
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                '}';
    }
}
public class Test01 {
    public static void main(String[] args) {
        // 创建聚合对象
        StudentAggregateImpl aggregate = new StudentAggregateImpl();
        // 添加
        aggregate.addStudent(new Student("张三", "001"));
        aggregate.addStudent(new Student("李四", "002"));
        aggregate.addStudent(new Student("王五", "003"));
        aggregate.addStudent(new Student("小明", "004"));
        // 遍历
        // 获取迭代器
        StudentIterator studentIterator = aggregate.getStudentIterator();
        // 遍历
        while (studentIterator.hasNext()){
            // 获取元素
            Student student = studentIterator.next();
            System.out.println(student.toString());
        }

    }
}

在这里插入图片描述

优缺点

  • 优点
    • 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。
    • 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
    • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无需修改原有代码,满足开闭原则。
  • 缺点
    • 增加了类的个数,在一定程度上增加了系统的复杂性。

使用场景

  • 当需要为聚合对象提供多种遍历方式时。
  • 当需要遍历不同的聚合结构提供一个统一的接口时。
  • 当访问一个聚合对象的内容而无需暴露其内部细节的表示时。
文章来源:https://blog.csdn.net/m0_60370702/article/details/135026219
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。