【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

简介: 【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录

一、迭代器模式简介

二、迭代器模式适用场景

三、迭代器模式优缺点

四、迭代器模式和访问者模式

五、迭代器模式代码示例

1、迭代器接口

2、迭代器实现

3、集合元素实例类

4、集合管理接口

5、集合管理实现类

6、测试类





一、迭代器模式简介


迭代器模式 : 提供一种方法 , 顺序访问 集合对象 中的 各个元素 , 而 不暴露 该对象 的内部表示 ;



迭代器模式类型 : 行为型 ;






二、迭代器模式适用场景


迭代器模式适用场景 :


内容保密 : 访问 集合对象 的内容 , 无需暴露内部表示 ;

统一接口 : 为遍历 不同的 集合结构 , 提供统一接口 ;





三、迭代器模式优缺点


迭代器模式优点 : 分离 了 集合对象 的 遍历行为 ; 抽象出了 迭代器 负责 集合对象的遍历 , 可以让外部的代码 透明的 访问集合内部的数据 ;



迭代器模式缺点 : 类的个数成对增加 ; 迭代器模式 , 将 存储数据 , 遍历数据 两个职责拆分 ; 如果新添加一个 集合类 , 需要增加该 集合类 对应的 迭代器类 , 类的个数成对增加 , 在一定程度上 , 增加了系统复杂性 ;






四、迭代器模式和访问者模式


迭代器模式和访问者模式 : 两个模式都是 迭代地 访问集合对象中的元素 ,


访问者模式 : 访问者模式 中 , 扩展开放的部分 , 作用于对象的操作上 ;

迭代器模式 : 迭代器模式 中 , 扩展开放的部分 , 是在对象的种类上 ;


迭代器模式 , 应用广泛 , 但是基本都使用 JDK 中提供的迭代器 , 不需要自己实现 ;






五、迭代器模式代码示例


业务场景 : 使用迭代器模式 , 管理多个学生的信息 ;



1、迭代器接口


package iterator;
public interface StudentIterator {
    /**
     * 获取下一个学生对象
     * @return
     */
    Student nextStudent();
    /**
     * 是否是最后一个
     * @return
     */
    boolean isLast();
}



2、迭代器实现


package iterator;
import java.util.ArrayList;
public class StudentIteratorImpl implements StudentIterator{
    /**
     * 学生集合, 通过构造函数注入
     */
    private ArrayList<Student> list;
    /**
     * 当前处理的集合索引
     */
    private int position;
    /**
     * 当前处理的学生对象
     */
    private Student student;
    public StudentIteratorImpl(ArrayList<Student> list) {
        this.list = list;
    }
    @Override
    public Student nextStudent() {
        System.out.println("返回 " + position + " 位置的学生对象 : " + student);
        student = list.get(position);
        position++;
        return student;
    }
    @Override
    public boolean isLast() {
        return position < list.size() ? false : true;
    }
}



3、集合元素实例类


=package iterator;
public class Student {
    String name;
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}


4、集合管理接口


package iterator;
/**
 * 集合的管理类
 */
public interface StudentAggregate {
    /**
     * 增加学生
     * @param student
     */
    void addStudent(Student student);
    /**
     * 删除学生
     */
    void removeStudent(Student student);
    /**
     * 获取学生集合的迭代器
     * @return
     */
    StudentIterator getStudentIterator();
}


5、集合管理实现类


package iterator;
import java.util.ArrayList;
/**
 * 维护集合
 */
public class StudentAggregateImpl implements StudentAggregate{
    /**
     * 学生集合
     */
    private ArrayList<Student> list;
    public StudentAggregateImpl() {
        this.list = new ArrayList<>();
    }
    @Override
    public void addStudent(Student student) {
        this.list.add(student);
    }
    @Override
    public void removeStudent(Student student) {
        this.list.remove(student);
    }
    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(this.list);
    }
}


6、测试类


package iterator;
public class Main {
    public static void main(String[] args) {
        // 创建 3 个学生对象
        Student tom = new Student("Tom");
        Student jerry = new Student("Jerry");
        Student trump = new Student("Trump");
        // 构造学生对象集合
        StudentAggregate studentAggregate = new StudentAggregateImpl();
        studentAggregate.addStudent(tom);
        studentAggregate.addStudent(jerry);
        studentAggregate.addStudent(trump);
        // 获取学生对象的迭代器
        StudentIterator studentIterator = studentAggregate.getStudentIterator();
        // 判断是否是最后一个对象 , 如果不是 , 获取下一个对象 , 并打印
        while (!studentIterator.isLast()) {
            Student student = studentIterator.nextStudent();
            System.out.println(student);
        }
        // 删除一个对象
        studentAggregate.removeStudent(trump);
        System.out.println("删除 Trump" );
        studentIterator = studentAggregate.getStudentIterator();
        // 判断是否是最后一个对象 , 如果不是 , 获取下一个对象 , 并打印
        while (!studentIterator.isLast()) {
            Student student = studentIterator.nextStudent();
            System.out.println(student);
        }
    }
}


执行结果 :


返回 0 位置的学生对象 : null
Student{name='Tom'}
返回 1 位置的学生对象 : Student{name='Tom'}
Student{name='Jerry'}
返回 2 位置的学生对象 : Student{name='Jerry'}
Student{name='Trump'}
删除 Trump
返回 0 位置的学生对象 : null
Student{name='Tom'}
返回 1 位置的学生对象 : Student{name='Tom'}
Student{name='Jerry'}


image.pngimage.pngimage.pngimage.pngimage.png

image.png


目录
相关文章
|
1月前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
38 4
|
1月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
37 4
|
11天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
25 4
|
13天前
|
设计模式 消息中间件 存储
18个并发场景的设计模式详解,有没有你的盲区
这些模式在多线程并发编程中非常有用`。在分布式应用中,并发场景无处不在,理解和掌握这些并发模式的编码技巧,有助于我们在开发中解决很多问题,这要把这些与23种设计模式混淆了,虽然像单例模式是同一个,但这个是考虑并发场景下的应用。内容比较多,V哥建议可以收藏起来,即用好查。拜拜了您誒,晚安。
18个并发场景的设计模式详解,有没有你的盲区
|
19天前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
1月前
|
设计模式 Java
小谈设计模式(21)—迭代器模式
小谈设计模式(21)—迭代器模式
|
1月前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0
|
1月前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
29 4
|
1月前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
26 1
|
1月前
|
设计模式 Java Windows
23种设计模式,抽象工厂模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。该模式允许客户端在不知道具体类的情况下,通过其共同的接口来创建一组产品。
31 7