设计模式-迭代器

news2024/11/17 9:52:25

文章目录

  • 1. 引言
    • 1.1 概述
    • 1.2 设计模式
    • 1.3 迭代器模式的应用场景
    • 1.4 迭代器模式的作用
  • 2. 基本概念
    • 2.1 迭代器 Iterator
    • 2.2 聚合 Aggregate
    • 2.3 具体聚合 ConcreteAggregate
  • 3. Java 实现迭代器模式
    • 3.1 Java 集合框架
    • 3.2 Java 迭代器接口
    • 3.3 Java 迭代器模式实现示例
  • 4. 迭代器模式的优缺点
    • 4.1 优点
    • 4.2 缺点
  • 5. 迭代器模式和其他设计模式的关系
    • 5.1 迭代器模式和工厂模式
    • 5.2 迭代器模式和组合模式
    • 5.3 迭代器模式和模板方法模式
  • 6. 总结
    • 6.1 迭代器模式的应用场景
    • 6.2 迭代器模式与其他设计模式的关系
    • 6.3 迭代器模式的优缺点

1. 引言

1.1 概述

迭代器模式是一种行为型设计模式,它允许客户端逐个访问聚合对象中的元素,而不用暴露聚合对象的内部表示。

1.2 设计模式

设计模式是解决特定问题的经过验证的最佳实践,它提供了一种通用的解决方案,可以在不同的场景下重复使用。

1.3 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。
在这里插入图片描述

1.4 迭代器模式的作用

迭代器模式的主要作用是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。

2. 基本概念

2.1 迭代器 Iterator

迭代器是一个接口,定义了访问和遍历聚合对象元素的方法。迭代器提供了一种统一的访问方式,使得客户端可以不依赖聚合对象的具体类型和内部结构,而直接访问其中的元素。

2.2 聚合 Aggregate

聚合是一个接口,表示一个集合对象。聚合对象通常包含多个元素,可以提供多种访问方法,例如获取某个元素、添加和删除元素等。

2.3 具体聚合 ConcreteAggregate

具体聚合是聚合的具体实现,它实现了聚合接口,并且维护了内部元素的数据结构,例如数组、链表、栈、队列等。

3. Java 实现迭代器模式

3.1 Java 集合框架

Java 集合框架是一组用于存储和操作元素的类和接口。集合框架提供了多种数据结构和算法,可以满足不同场景下的需求。Java 集合框架中的所有集合类都实现了 Iterable 接口,因此都可以使用迭代器进行遍历操作。

3.2 Java 迭代器接口

Java 提供了一个迭代器接口 Iterator,定义了访问和遍历集合中元素的方法。迭代器接口包含多个方法,例如 hasNext()、next()、remove() 等。

以下是迭代器接口的定义:

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

3.3 Java 迭代器模式实现示例

以下是一个使用迭代器模式的简单示例,通过实现 Iterable 和 Iterator 接口,在不暴露内部结构的情况下遍历聚合对象中的元素。

import java.util.Iterator;

public class MyCollection<T> implements Iterable<T> {
    private T[] elements;
    private int size;

    public MyCollection(T[] elements) {
        this.elements = elements;
        this.size = elements.length;
    }

    @Override
    public Iterator<T> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<T> {
        private int index;

        public MyIterator() {
            this.index = 0;
        }

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public T next() {
            return elements[index++];
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        String[] names = {"Alice", "Bob", "Charlie", "Dave"};

        MyCollection<String> collection = new MyCollection<>(names);
        Iterator<String> iterator = collection.iterator();

        while (iterator.hasNext()) {
            String name = iterator.next();
            System.out.println(name);
        }
    }
}

在上述代码中,MyCollection 实现了 Iterable 接口,并且返回一个实现了 Iterator 接口的内部类 MyIterator。MyIterator 中维护了一个 index 变量,表示当前遍历到的元素位置,hasNext() 方法用于判断是否还有下一个元素,next() 方法用于返回当前元素并将 index 加一。
在这里插入图片描述

4. 迭代器模式的优缺点

4.1 优点

  • 将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,遍历过程不会受到影响。
  • 提供了多种遍历方式,客户端可以根据自己的需求选择合适的遍历方式。
  • 对于不同类型的聚合对象,都可以提供统一的访问方式,使得客户端编码更加简单。

4.2 缺点

  • 对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

5. 迭代器模式和其他设计模式的关系

5.1 迭代器模式和工厂模式

迭代器模式和工厂模式可以相互配合使用。在工厂模式中,可以使用迭代器遍历某个产品对象中的元素,实现对产品的全面访问。

5.2 迭代器模式和组合模式

迭代器模式和组合模式可以相互配合使用。在组合模式中,可以使用迭代器遍历整个组合结构中的所有元素,实现对组合结构的遍历和访问。

5.3 迭代器模式和模板方法模式

迭代器模式和模板方法模式也可以相互配合使用。在模板方法模式中,可以将迭代器作为模板方法的一部分,实现对聚合对象中元素的遍历和访问。

6. 总结

6.1 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。

6.2 迭代器模式与其他设计模式的关系

迭代器模式和工厂模式、组合模式、模板方法模式等其他设计模式可以相互配合使用,实现更加灵活的编程。

6.3 迭代器模式的优缺点

迭代器模式的主要优点是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。其缺点是对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

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

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

相关文章

ESP32系列ESP32-D0WD双模BLE4.2+2.4G WIFI SoC芯片

目录 ESP32系列简介ESP32系列SoC功能框图ESP32-D0WD-V3芯片特性 ESP32系列SoC对比 ESP32系列简介 ESP32-DU1906和ESP32-DU1906-U两款AI模组&#xff0c;是基于ESP32-D0WD-V3芯片和语音芯片DU1906设计&#xff0c;集Wi-Fi、 传统蓝牙、低功耗蓝牙性能&#xff0c;以及音频语音处…

11.添加侧边栏,并导入数据

修改CommonAside的代码&#xff1a; <template><div><el-menu default-active"1-4-1" class"el-menu-vertical-demo" open"handleOpen" close"handleClose":collapse"isCollapse"><!--<el-menu-it…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——假言——各种假言

角度 多重假言 &#xff08;1&#xff09;如果A&#xff0c;那么B&#xff0c;除非C。 符号化为&#xff1a;┐C→ (A→B)。 等价于&#xff1a;┐C→ (┐A∨B)。 等价于&#xff1a;C∨(┐A∨B)。 等价于&#xff1a;C∨┐A∨B。 等价于&#xff1a;┐(C∨┐A&#xff09;→…

K8S自动化运维容器化(Docker)集群程序

K8S自动化运维容器化集群程序 一、K8S概述1.什么是K8S2.为什么要用K8S3.作用及功能 二、K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三、K8S的集群架构1.架构2.模式3.工作4.流程图 四、K8S的核…

电子电路原理题目整理(2)

半导体是一种既不是导体也不是绝缘体的材料&#xff0c;其中包含自由电子和空穴&#xff0c;空穴的存在使半导体具有特殊的性质。 1.为什么铜是电的良导体&#xff1f; 从原子结构来看&#xff0c;铜原子的价带轨道上有一个价电子&#xff0c;由于核心和价电子之间的吸引力很弱…

【zookeeper】zookeeper的shell操作

Zookeeper的shell操作 本章节将分享一些zookeeper客服端的一些命令&#xff0c;实验操作有助于理解zookeeper的数据结构。 Zookeeper命令工具 在前一章的基础上&#xff0c;在启动Zookeeper服务之后&#xff0c;输入以下命令&#xff0c;连接到Zookeeper服务。连接成功之后&…

Shell - 根据进程名过滤进程信息

文章目录 #/bin/bash #Function: 根据输入的程序的名字过滤出所对应的PID&#xff0c;并显示出详细信息&#xff0c;如果有几个PID&#xff0c;则全部显示 read -p "请输入要查询的进程名&#xff1a;" NAME Nps -aux | grep $NAME | grep -v grep | wc -l ##统计进程…

go学习part20(1)反射

283_尚硅谷_反射基本介绍和示意图_哔哩哔哩_bilibili 1.介绍 1&#xff09;基本数据类型的类型和类别一致&#xff0c;但是结构体等不一样。 2)反射的例子&#xff08;桥连接&#xff0c;序列化&#xff09; 序列化指定tag&#xff0c;会反射生成tag字符串 3&#xff09;refl…

【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析

RocketMQ目前在国内应该是比较流行的MQ 了&#xff0c;目前本人也在公司的项目中进行使用和研究&#xff0c;借着这个机会&#xff0c;分析一下RocketMQ 发送一条消息到存储一条消息的过程&#xff0c;这样会对以后大家分析和研究RocketMQ相关的问题有一定的帮助。 分析的总体…

如何增长LLM推理token,从直觉到数学

背景&#xff1a; 最近大模型输入上文长度增长技术点的研究很火。为何要增长token长度,为何大家如此热衷于增长输入token的长度呢&#xff1f;其实你如果是大模型比价频繁的使用者&#xff0c;这个问题应该不难回答。增长了输入token的长度&#xff0c;那需要多次出入才能得到…

【LeetCode】383. 赎金信 - hashmap/数组

这里写自定义目录标题 2023-8-28 22:54:39 383. 赎金信 2023-8-28 22:54:39 次数 ----> hashmap 和 数组来进行实现。 public class Solution {public boolean canConstruct(String ransomNote, String magazine) {// num 用于存储小写字母出现的次数int[] num new in…

vue报错RangeError: Maximum call stack size exceeded

这种情况&#xff0c;一般是跳转路由时发生此类错误&#xff0c;像我的就是如此。比如路由指向的vue文件里代码有错误&#xff0c;或者设置路由时重定向了路由自己&#xff0c;造成死循环。 1、首先检查自己跳转的路由地址的代码本身是否有语法错误之类的&#xff0c;造成错误…

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了&#xff0c;全程只需要一部手机&#xff0c;就能完成24小时直播带货&#xff0c;不需要真人出镜&#xff0c;不需要场地&#xff0c;不需要搭建直播间&#xff0c;只需要一部手机就可以了。真人语音讲解&#xff0c;真人智能回复&#xff0c;实…

「操作系统」1. 基础

前言&#xff1a;操作系统基础八股文 文章目录 一 、操作系统基础1.1 什么是操作系统&#xff1f;1.2 什么是系统调用1.3 什么是中断 &#x1f680; 作者简介&#xff1a;作为某云服务提供商的后端开发人员&#xff0c;我将在这里与大家简要分享一些实用的开发小技巧。在我的职…

腾讯云-对象存储服务(COS)的使用总结-JavaScript篇

简介 对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种存储海量文件的分布式存储服务&#xff0c;具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式&#xff0c;用户可简单、快速地接入 COS&#xff0…

ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习

一、学习层面&#xff1a;ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习 1.帮助高职院校学生实现个性化自适应学习 数字技术的飞速发展引起了教育界和学术界对高职院校学生个性化自适应学习的更多关注和支持&#xff0c;其运作机制依赖于人工智能等技术&#xff0…

面经:微服务

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册&#xff1a;Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式&#xff1f;2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

微信小程序校园生活小助手+后台管理系统|前后分离VUE

《微信小程序校园生活小助手后台管理系统|前后分离VUE》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统&#xff0c;该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&#…

【RISC-V】RISC-V寄存器

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

金融风控数据分析-信用评分卡建模(附数据集下载地址)

本文引用自&#xff1a; 金融风控&#xff1a;信用评分卡建模流程 - 知乎 (zhihu.com) 在原文的基础上加上了一部分自己的理解&#xff0c;转载在CSDN上作为保留记录。 本文涉及到的数据集可直接从天池上面下载&#xff1a; Give Me Some Credit给我一些荣誉_数据集-阿里云…