设计模式(二十):行为型之迭代器模式

news2024/9/8 23:43:18

设计模式系列文章

设计模式(一):创建型之单例模式

设计模式(二、三):创建型之工厂方法和抽象工厂模式

设计模式(四):创建型之原型模式

设计模式(五):创建型之建造者模式

设计模式(六):结构型之代理模式

设计模式(七):结构型之适配器模式

设计模式(八):结构型之装饰器模式

设计模式(九):结构型之桥接模式

设计模式(十):结构型之外观模式

设计模式(十一):结构型之组合模式

设计模式(十二):结构型之享元模式

设计模式(十三):行为型之模板方法模式

设计模式(十四):行为型之策略模式

设计模式(十五):行为型之命令模式

设计模式(十六):行为型之责任链模式

设计模式(十七):行为型之状态模式

设计模式(十八):行为型之观察者模式

设计模式(十九):行为型之中介者模式

设计模式(二十):行为型之迭代器模式


目录

  • 一、设计模式分类
  • 二、迭代器模式
    • 1、概述
    • 2、结构
    • 3、实现
    • 4、优缺点
    • 5、使用场景
    • 6、JDK源码解析


一、设计模式分类

  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式

二、迭代器模式

1、概述

定义

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

2、结构

迭代器模式主要包含以下角色:

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

3、实现

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

类图如下:

在这里插入图片描述

代码如下:

  • 定义迭代器接口,声明hasNext、next方法
public interface StudentIterator {

    //判断是否还有元素
    boolean hasNext();

    //获取下一个元素
    Student next();
}
  • 定义具体的迭代器类,重写所有的抽象方法
public class StudentIteratorImpl implements StudentIterator {

    private final 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 stu);

    //删除学生功能
    void removeStudent(Student stu);

    //获取迭代器对象功能
    StudentIterator getStudentIterator();
}
  • 定义具体的容器类,重写所有的方法
public class StudentAggregateImpl implements StudentAggregate {

    // 学生列表
    private final List<Student> list = new ArrayList<>();

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

    @Override
    public void removeStudent(Student stu) {
        list.remove(stu);
    }

    //获取迭代器对象
    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}
  • 测试类
public class Client {
    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"));

        //1,获取迭代器对象
        StudentIterator iterator = aggregate.getStudentIterator();
        //2,遍历
        while(iterator.hasNext()) {
            //3,获取元素
            Student student = iterator.next();
            System.out.println(student.toString());
        }
    }
}

4、优缺点

优点

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

缺点

  • 增加了类的个数,这在一定程度上增加了系统的复杂性

5、使用场景

  • 当需要为聚合对象提供多种遍历方式时
  • 当需要为遍历不同的聚合结构提供一个统一的接口时
  • 当访问一个聚合对象的内容而无须暴露其内部细节的表示时

6、JDK源码解析

迭代器模式在JAVA的很多集合类中被广泛应用

List<String> list = new ArrayList<>();
//list.iterator()方法返回的肯定是Iterator接口的子实现类对象
Iterator<String> iterator = list.iterator(); 
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

单列集合都使用到了迭代器,我们以ArrayList举例来说明

在这里插入图片描述

  • List:抽象聚合类
  • ArrayList:具体的聚合类
  • Iterator:抽象迭代器
  • list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

具体的来看看 ArrayList的代码实现

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    
    public Iterator<E> iterator() {
        return new Itr();
    }
    
    private class Itr implements Iterator<E> {
        int cursor;       // 下一个要返回元素的索引
        int lastRet = -1; // 上一个返回元素的索引
        int expectedModCount = modCount;

        Itr() {}
		
        //判断是否还有元素
        public boolean hasNext() {
            return cursor != size;
        }

        //获取下一个元素
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
        ...
}
  • iterator() 方法中返回了一个实例化的Iterator对象
  • Itr是ArrayList一个内部类,它实现了 Iterator 接口并重写了其中的抽象方法

注意:

  • 当我们在使用JAVA开发的时候,想使用迭代器模式的话
  • 只要让我们自己定义的容器类实现java.util.Iterable并实现其中的iterator()方法使其返回一个 java.util.Iterator 的实现类就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW开发移动车辆的识别和特征提取

LabVIEW开发移动车辆的识别和特征提取 闭路电视摄像机在高速公路上变得越来越普遍&#xff0c;并用于交通管理;摄像机允许操作员直观地监控交通状况。随着摄像机数量的增加&#xff0c;操作员监控每个摄像机成为一项艰巨的任务&#xff0c;因此录制视频&#xff0c;并且通常仅…

Hack The Box - Web - Phonebook

玩一会儿htb的challenge&#xff0c;最近找工作&#xff0c;所以先玩玩web类型的。 这道题目的类型有人说是LDAP注入、有人说是like注入。LDAP这玩意08年的时候估计可能比较流行&#xff0c;但是现在应该没多少人用了吧&#xff0c;比较小众。其实LDAP这个特殊的数据库是比较契…

LwIP RAW API 实现UDP多播收发

LwIP RAW API 实现UDP多播收发实现 1、初始化 static struct udp_pcb *multicast_pcb NULL; static ip_addr_t mutlcast_send_ip; static ip_addr_t mutlcast_recv_ip;static void udp_recv_multicast(void *arg, struct udp_pcb *pcb, struct pbuf *p,const ip_addr_t *add…

安装cv2库时出现错误的一般解决方法

问题描述&#xff1a; 安装cv2库时出现错误 补充&#xff1a;cv2库的简单介绍 cv2是Python中常用的计算机视觉库OpenCV的Python接口模块。通过使用cv2模块&#xff0c;您可以方便地进行图像和视频的读取、处理和显示等操作。它提供了许多常用的图像处理函数和工具&#xff0…

WPF基础学习笔记3-文本控件

1.文本控件 文本控件System.Windows.Controls,TextBox继承自System.Windows.Controls.TextBoxBase类System.Windows.Controls.RichTextBox继承自System.Windows.Controls.TextBoxBase类 1.1 TextBox 表示一个控件&#xff0c;该控件可用于显示或编辑无格式文本 <Grid>&l…

Python算法练习6.17

leetcode 1768 交替合并字符串 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 输入&#xff1a;word1 &qu…

【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们介绍了 Pod 的生命周期以及区分 Pod 字段的层次级别&#xff0c;相信你对此有了充分的认识。 今天&#xff0c;我们还会接着以 Pod 展开&#xff0c;说说它的 “服务对象”&#xff0c;一听就知道是对 Pod 提…

RocketMQ_高级功能

目录 一、消息存储 1、存储介质以及性能对比 2、消息的存储和发送 3、消息存储结构 4、刷盘机制 二、高可用性机制 1、消息消费高可用 2、消息发送高可用 3、消息主从复制 三、负载均衡 1、Producer负载均衡 2、Consumer负载均衡 四、消息重试 1、顺序消息的重试…

微信无人托管智能客服系统

随着人工智能技术的不断发展&#xff0c;大语言模型、智能客服、垂直化场景应用和微信聊天等三方终端系统已经成为了企业营销的重要工具。这些技术的结合可以帮助企业更好地与客户进行沟通&#xff0c;提高客户满意度和忠诚度&#xff0c;从而实现营销目标。 大语言模型可以帮…

Android:绘制自定义View人脸识别框

一.绘制矩形框实现 项目开发需要自定义View实现一个人脸框&#xff0c;代码实现很平常&#xff0c;一些细节记录一下&#xff0c;方便以后查阅。 代码实现&#xff1a; 1.1 自定义人脸识别框&#xff1a; FaceView.java package com.android.example.ui.view;import andro…

018:vue中自定义el-table 表头和单元格的样式

第018个 el-table 用于展示多条结构类似的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 vue在使用element UI table的是经常要用到的&#xff0c;由于原有的表头和单元格的样式不能满足项目的需要&#xff0c;需要自己来自定义样式。同时这里也做了个overf…

B/S版医院检验科lis系统源码 云lis系统

LIS系统为实验室服务对象提供检验申请、采集标本、结果查询等功能&#xff1b;为实验室工作人员的核收标本、分送标本、传送资料、分析前处理、质量控制、单向或双向通讯、分析后处理、结果审核、打印报告、结果查询等标本检测过程提供全面的技术支持。 .Net Core LIS系统源码…

python代码性能分析

基准测试可以发现程序变慢了&#xff0c;那么是因为什么原因导致性能变慢的&#xff0c;需要进一步做代码性能分析。python同样提供了性能分析工具。 cProfile cProfile是python默认的性能分析器&#xff0c;他只测量CPU时间&#xff0c;并不关心内存消耗和其他与内存相关联的…

逻辑越权之找回机制及接口安全(35)

会涉及到这三个内容 验证会涉及到&#xff0c;暴力测试&#xff0c;绕过测试 找回会涉及到&#xff0c;客户端回显&#xff0c;respponse状态值&#xff0c;找回流程绕过 接口会涉及到&#xff0c;调用便利 找回就像是忘记密码那种&#xff0c;然后会有验证&#xff0c;手机…

知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用16-知识图谱在化学物质结构上的应用,快速查找化学分子式与结构。在化学领域,知识图谱可以应用于化学物质结构上。化学物质结构主要指分子结构和化学键的组成情况。知识图谱可以将化学物质结构的相关数据以图谱的形式展…

oVirt 4.4.10三节点超融合集群安装配置及集群扩容(三)

本篇主要记录安装及使用过程中遇到的问题<包含4.4.x, 4.5.x> 设置engine管理页面可以通过IP访问ssh连接engine服务器并在/etc/ovirt-engine/engine.conf.d新建99-custom-sso-setup.conf,添加engine节点的IP或出口IPSSO_ALTERNATE_ENGINE_FQDNS="engine103.cluster.…

MySQL 索引与事务

MySQL 索引相关知识详解与事务的详解 一、索引的概念二、索引的作用索引的副作用 三、索引是如何实现的四、创建索引的原则依据五、索引的优缺点1、优点2、缺点 六、索引的分类和创建1、普通索引2、唯一索引3、主键索引4、组合索引5、全文索引 七、索引的查看八、索引的删除1、…

操作系统2:进程的描述与控制

目录 1、什么是前驱图&#xff1f; 2、进程的定义和描述 &#xff08;1&#xff09;什么是进程&#xff1f; &#xff08;2&#xff09;进程的基本状态及转换 &#xff08;3&#xff09;挂起操作和进程状态的转换 3、进程管理中的数据结构 &#xff08;1&#xff09;进程…

楼宇照明系统在图书馆的应用介绍 安科瑞 许敏

【摘要】EIB总线作为楼宇家居自动化控制技术的主流&#xff0c;具有适应性好、功能强大与可靠性高等多方面优点&#xff0c;能很 好地满足定时、合成照度、人体检测和手控等不同的照明控制需求。通过智能化的自动控制实现了楼宇的舒适照 明和节能照明两大目标&#xff0c;克服传…