• 23种设计模式之迭代器模式(Iterator Pattern)


    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
    如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
    小威在此先感谢各位大佬啦~~🤞🤞
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    以下正文开始
    在这里插入图片描述

    迭代器模式概念

    迭代器模式是一种对象行为型设计模式。它提供了遍历集合对象所需的标准接口,而不暴露集合对象的实现方式

    在Java编程中,常见的集合类包括List、Set和Map等,这些都内部维护着一个元素列表。通过迭代器模式,对于任何一种集合对象,在不了解其内部实现的情况下,都可以轻松地遍历其中的每个元素,从而简化了代码的编写和维护。

    迭代器模式构成部分

    迭代器模式由两个主要组成部分构成:迭代器(Iterator)和可迭代对象(Iterable)。迭代器用于定义访问和遍历元素的接口,而可迭代对象用于返回迭代器。

    下面是迭代器模式的基本结构:

    迭代器(Iterator):定义访问和遍历聚合对象元素的接口;
    具体迭代器(ConcreteIterator):实现迭代器接口,并对聚合对象进行遍历和存储当前遍历位置等操作;
    可迭代对象(Iterable):定义获取迭代器的接口;
    具体可迭代对象(ConcreteIterable):实现可迭代对象接口,返回具体的迭代器实例。
    迭代器模式的使用步骤如下:

    定义聚合对象的对象结构,包含 add()、remove()和 get()等方法;
    定义迭代器接口 Iterator,并声明 getFirst()、getNext()、isDone() 和 getCurrentItem() 方法;
    实现具体迭代器 ConcreteIterator 类,维护一个指向当前位置的指针,实现 Iterator 接口中的方法实现元素遍历;
    实现可迭代对象 Iterable 接口,并实现创建迭代器实例的方法 iterator();
    在客户端代码中使用该聚合对象和迭代器通过 hasNext()、next() 等方法对集合对象进行访问和遍历。
    总之,迭代器模式是一种非常有用且广泛应用于实际开发的设计模式,它可以有效地解耦集合对象和其遍历方式,使得代码更加简洁和易于维护。

    迭代器模式案例

    假设我们有一个存储了学生信息的集合类 StudentList,包含了 addStudent()、removeStudent()和 getStudent()等方法。现在,我们需要基于迭代器模式来遍历这个学生信息集合。具体步骤如下:

    定义迭代器接口 Iterator:

    public interface Iterator {
        public boolean hasNext();
        public Object next();
    }
    
    • 1
    • 2
    • 3
    • 4

    实现具体的迭代器类 ConcreteIterator:

    public class ConcreteIterator implements Iterator {
        private StudentList studentList;
        private int index = 0;
    
        public ConcreteIterator(StudentList list) {
            this.studentList = list;
        }
    
        @Override
        public boolean hasNext() {
            return index < studentList.getLength();
        }
    
        @Override
        public Object next() {
            if (hasNext()) {
                return studentList.getStudent(index++);
            }
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    定义可迭代对象接口 Iterable:

    public interface Iterable {
        public Iterator iterator();
    }
    
    • 1
    • 2
    • 3

    实现具体的可迭代对象类 ConcreteIterable:

    public class ConcreteIterable implements Iterable {
        private StudentList studentList;
    
        public ConcreteIterable(StudentList list) {
            this.studentList = list;
        }
    
        @Override
        public Iterator iterator() {
            return new ConcreteIterator(studentList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在客户端代码中使用聚合对象和迭代器进行遍历:

    public static void main(String[] args) {
        StudentList list = new StudentList();
        list.addStudent("Tom");
        list.addStudent("Mary");
        list.addStudent("John");
    
        ConcreteIterable iterable = new ConcreteIterable(list);
        Iterator iterator = iterable.iterator();
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            System.out.println(name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面的代码中,我们首先定义了迭代器接口 Iterator,并在迭代器具体实现类 ConcreteIterator 中实现了遍历集合对象的逻辑。然后,我们定义了可迭代对象接口 Iterable,并在其实现类 ConcreteIterable 中返回具体的迭代器实例。最后,在客户端代码中使用该聚合对象和迭代器通过 hasNext()、next() 等方法对集合对象进行访问和遍历。

    迭代器模式小结

    总的来说,迭代器模式将聚合对象和遍历方式分离,提供了一种通用的遍历机制,使得不同类型的集合对象均可以方便地进行遍历,并且通过迭代器接口也可以更加灵活地定义迭代器的行为

    好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
    在这里插入图片描述

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
    希望能和诸佬们一起努力,今后我们顶峰相见🍻
    再次感谢各位小伙伴儿们的支持🤞

    在这里插入图片描述

  • 相关阅读:
    HCNP Routing&Switching之RSTP保护
    java计算机毕业设计计算机类专业考研交流学习平台源码+mysql数据库+系统+lw文档+部署
    Redis避坑指南:为什么要有分布式锁?
    1. JS 和 Jquery 获取元素对象 `$()`
    tslib库的移植
    Kubernetes安装GitLab
    学习ASP.NET Core Blazor编程系列十——路由(下)
    ae如何去除视频水印?分享三个简单的方法!
    [MAUI]模仿哔哩哔哩的一键三连
    【JavaSE】static关键字
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/130898739