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

举报
韩曙亮 发表于 2022/01/12 22:54:40 2022/01/12
【摘要】 文章目录 一、迭代器模式简介二、迭代器模式适用场景三、迭代器模式优缺点四、迭代器模式和访问者模式五、迭代器模式代码示例1、迭代器接口2、迭代器实现3、集合元素实例类4、集合管理接口5、集合管理实现...





一、迭代器模式简介



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


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





二、迭代器模式适用场景



迭代器模式适用场景 :

  • 内容保密 : 访问 集合对象 的内容 , 无需暴露内部表示 ;
  • 统一接口 : 为遍历 不同的 集合结构 , 提供统一接口 ;




三、迭代器模式优缺点



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


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





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



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

  • 访问者模式 : 访问者模式 中 , 扩展开放的部分 , 作用于对象的操作上 ;
  • 迭代器模式 : 迭代器模式 中 , 扩展开放的部分 , 是在对象的种类上 ;

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





五、迭代器模式代码示例



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


1、迭代器接口


package iterator;

public interface StudentIterator {
    /**
     * 获取下一个学生对象
     * @return
     */
    Student nextStudent();

    /**
     * 是否是最后一个
     * @return
     */
    boolean isLast();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

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 + '\'' +
                '}';
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

4、集合管理接口


package iterator;

/**
 * 集合的管理类
 */
public interface StudentAggregate {
    /**
     * 增加学生
     * @param student
     */
    void addStudent(Student student);

    /**
     * 删除学生
     */
    void removeStudent(Student student);

    /**
     * 获取学生集合的迭代器
     * @return
     */
    StudentIterator getStudentIterator();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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);
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

执行结果 :

返回 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'}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119777612

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。