• 设计模式(16)迭代器模式


    一、介绍:

    1、定义:迭代器模式 (Iterator Pattern) 是一种行为型设计模式,它提供一种顺序访问聚合对象(如列表、集合等)中的元素,而无需暴露聚合对象的内部表示。迭代器模式将遍历逻辑封装在一个迭代器对象中,使得我们可以使用统一的方式遍历不同类型的聚合对象,同时也可以简化客户端代码。

    2、组成:

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

    二、demo:

    1、

    1. package com.demo.ddq.dto;
    2. public class Student {
    3. private String name;
    4. private String number;
    5. public Student() {
    6. }
    7. public Student(String name, String number) {
    8. this.name = name;
    9. this.number = number;
    10. }
    11. @Override
    12. public String toString() {
    13. return "Student{" +
    14. "name='" + name + '\'' +
    15. ", number='" + number + '\'' +
    16. '}';
    17. }
    18. /**省略所有set、get方法*/
    19. }

    (1)抽象迭代器

    1. //抽象迭代器角色接口
    2. public interface StudentIterator {
    3. //判断是否还有元素
    4. boolean hasNext();
    5. //获取下一个元素
    6. Student next();
    7. }

    (2)具体迭代器

    1. //具体迭代器角色类
    2. public class StudentIteratorImpl implements StudentIterator{
    3. private List<Student> list;
    4. //用来记录遍历时的位置
    5. private int position = 0;
    6. public StudentIteratorImpl(List<Student> list) {
    7. this.list = list;
    8. }
    9. @Override
    10. public boolean hasNext() {
    11. return position < list.size();
    12. }
    13. @Override
    14. public Student next() {
    15. //从集合中或者去指定位置的元素
    16. Student currentStudent = list.get(position);
    17. position++;
    18. return currentStudent;
    19. }
    20. }

    (3)抽象聚合:

    1. //抽象聚合(容器)角色接口
    2. public interface StudentAggregate {
    3. //添加学生
    4. void addStudent(Student stu);
    5. //删除学生
    6. void removeStudent(Student stu);
    7. //获取迭代器对象
    8. StudentIterator getStudentIterator();
    9. }

    (4)具体聚合:

    1. public class StudentAggregateImpl implements StudentAggregate{
    2. private List<Student> list = new ArrayList<>();
    3. @Override
    4. public void addStudent(Student stu) {
    5. list.add(stu);
    6. }
    7. @Override
    8. public void removeStudent(Student stu) {
    9. list.remove(stu);
    10. }
    11. //获取迭代器对象
    12. @Override
    13. public StudentIterator getStudentIterator() {
    14. return new StudentIteratorImpl(list);
    15. }
    16. }

    客户端:

    1. public class Test {
    2. public static void main(String[] args) {
    3. //创建聚合(容器)对象
    4. StudentAggregate aggregate = new StudentAggregateImpl();
    5. Student student1 = new Student("张三", "1001");
    6. Student student2 = new Student("李四", "1002");
    7. Student student3 = new Student("王五", "1003");
    8. Student student4 = new Student("钱七", "1004");
    9. //添加元素
    10. aggregate.addStudent(student1);
    11. aggregate.addStudent(student2);
    12. aggregate.addStudent(student3);
    13. aggregate.addStudent(student4);
    14. //删除元素
    15. aggregate.removeStudent(student3);
    16. //遍历聚合对象
    17. // 1.获取迭代器对象
    18. StudentIterator iterator = aggregate.getStudentIterator();
    19. // 2.遍历
    20. while (iterator.hasNext()) {
    21. // 3.获取元素
    22. Student student = iterator.next();
    23. System.out.println(student.toString());
    24. }
    25. }
    26. }
    27. 输出:
    28. Student{name='张三', number='1001'}
    29. Student{name='李四', number='1002'}
    30. Student{name='钱七', number='1004'}

  • 相关阅读:
    python中pydantic库
    类与对象(下篇)
    【HALCON】如何实现hw窗口自适应相机拍照成像的大小
    PyCharm 虚拟环境搭建
    如何在虚拟机 Ubuntu 20.04 上安装 VMware Tools
    CommonJs和Es Module的区别
    计算机毕业设计springboot精品课程网站u1aq3源码+系统+程序+lw文档+部署
    ArcGIS中将测绘数据投影坐标(平面坐标)转地理坐标(球面经纬度坐标)
    MYSQL数据库学习
    js的BoM事件(二)
  • 原文地址:https://blog.csdn.net/w_t_y_y/article/details/134035518