小谈设计模式(21)—迭代器模式

news2024/11/17 7:28:13

小谈设计模式(21)—迭代器模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 迭代器模式
    • 对象分析
      • 聚合对象(Aggregate)
      • 迭代器对象(Iterator)
    • Java程序示例
      • 程序分析
        • 1
        • 2
    • 优缺点分析
      • 优点
        • 简化了聚合对象的接口
        • 统一的遍历方式
        • 增加了代码的可读性和可维护性
      • 缺点
        • 增加了系统的复杂性
        • 迭代器的实现可能会受到聚合对象的影响
        • 不适合对于某些特殊聚合对象的遍历
      • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。在这里插入图片描述

迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而不需要暴露聚合对象的内部表示。迭代器模式将遍历元素的责任交给迭代器对象,从而简化了聚合对象的接口。
在这里插入图片描述

对象分析

聚合对象(Aggregate)

聚合对象是包含一组元素的对象,它通常提供一个创建迭代器的方法。聚合对象可以是一个集合、数组、列表等。聚合对象的主要职责是通过迭代器对象提供对元素的遍历。

在这里插入图片描述

迭代器对象(Iterator)

迭代器对象负责遍历聚合对象中的元素。它通常包含一些基本的方法,如获取下一个元素、判断是否还有下一个元素等。迭代器对象可以根据具体的需求实现不同的遍历方式,如正向遍历、逆向遍历等。
在这里插入图片描述

Java程序示例

// 聚合对象
public interface Aggregate {
    Iterator createIterator();
}

// 具体的聚合对象
public class ConcreteAggregate implements Aggregate {
    private List<Object> items = new ArrayList<>();

    public void addItem(Object item) {
        items.add(item);
    }

    public Iterator createIterator() {
        return new ConcreteIterator(items);
    }
}

// 迭代器对象
public interface Iterator {
    boolean hasNext();
    Object next();
}

// 具体的迭代器对象
public class ConcreteIterator implements Iterator {
    private List<Object> items;
    private int position = 0;

    public ConcreteIterator(List<Object> items) {
        this.items = items;
    }

    public boolean hasNext() {
        return position < items.size();
    }

    public Object next() {
        Object item = items.get(position);
        position++;
        return item;
    }
}

// 使用迭代器模式
public class Main {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.addItem("Item 1");
        aggregate.addItem("Item 2");
        aggregate.addItem("Item 3");

        Iterator iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            Object item = iterator.next();
            System.out.println(item);
        }
    }
}

在这里插入图片描述

程序分析

1

在上述示例中,Aggregate 接口定义了创建迭代器的方法 createIterator,ConcreteAggregate 是具体的聚合对象,实现了 createIterator 方法,返回具体的迭代器对象 ConcreteIterator。ConcreteIterator 实现了 Iterator 接口,提供了遍历聚合对象中元素的功能。

2

在 Main 类中,我们创建了一个具体的聚合对象 ConcreteAggregate,添加了一些元素。然后通过 createIterator 方法创建了一个迭代器对象,并使用 while 循环遍历聚合对象中的元素。
在这里插入图片描述

优缺点分析

优点

简化了聚合对象的接口

迭代器模式将遍历聚合对象的责任封装在迭代器对象中,使得聚合对象的接口更加简洁,只需要提供一个创建迭代器的方法即可。

统一的遍历方式

迭代器模式提供了一种统一的遍历方式,无论聚合对象的内部结构如何变化,都可以通过迭代器对象进行遍历,使得客户端代码更加简洁和可读。

增加了代码的可读性和可维护性

迭代器模式将遍历逻辑封装在迭代器对象中,使得代码的逻辑更加清晰,易于理解和维护。

缺点

增加了系统的复杂性

引入迭代器模式会增加系统的类和对象的数量,增加了系统的复杂性。

迭代器的实现可能会受到聚合对象的影响

迭代器的实现通常依赖于聚合对象的内部结构,如果聚合对象的结构发生变化,可能需要相应地修改迭代器的实现。

不适合对于某些特殊聚合对象的遍历

迭代器模式适用于遍历聚合对象的情况,但对于某些特殊的聚合对象,如树形结构,可能需要使用其他遍历方式。

总结

迭代器模式通过封装遍历聚合对象的责任,简化了聚合对象的接口,提供了一种统一的遍历方式,增加了代码的可读性和可维护性。然而,迭代器模式也会增加系统的复杂性,可能受到聚合对象的影响,并且不适用于某些特殊聚合对象的遍历。因此,在使用迭代器模式时需要权衡其优缺点,根据具体情况进行选择。

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

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

相关文章

20秒基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来&#xff0c;各大公司在大模型方面持续发力&#xff0c;行业大模型也如雨后春笋一般发展迅速&#xff0c;日常工作中比较多的应用场景还是问答模式&#xff0c;作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT&#xff0c;…

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多&#xff0c;以下方法不一定都适用&#xff0c;我是通过以下方法解决的 打开命令终端输入以下命令&#xff0c;可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches

Android---字节码层面分析Class类文件

Java 提供了一种可以在所有平台上都能使用的一种中间代码---字节码文件(.class文件)。有了字节码&#xff0c;无论是那个平台只要安装了虚拟机都可以直接运行字节码文件。有了虚拟机&#xff0c;解除了 java 虚拟机与 java 代码之间的耦合。 Java 虚拟机当初被设计出来时就不单…

【设计模式】访问者模式

文章目录 1.访问者模式定义2.访问者模式的角色3.访问者模式实战案例3.1.场景说明3.2.UML类图3.3.代码实现 4.访问者模式优缺点5.访问者模式适用场景6.访问者模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.访问者模式定义 访问者模式&#xff08;Visitor Pattern&#x…

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC)&#xff0c;在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

黑马JVM总结(二十六)

&#xff08;1&#xff09;异常-catch 下面看一下字节码里面怎么做异常的处理 &#xff08;2&#xff09;异常-多个catch astore_2:就是把异常对象的地址存到局部变量表2号曹位上 &#xff08;3&#xff09;异常-multicatch &#xff08;4&#xff09;异常-finally &#xff0…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果&#xff0c;话不多说&#xff0c;先来看看视频效果吧&#xff1a;链接 在这里具体的代码就不放出来了&#xff0c;还是利用了uniapp的 uni.createAnimation 方法&#xff0c;因为cover-view 不支持一些css 的动画效果&#xff0c;所以这…

探秘布隆过滤器:高效数据查找与去重利器

探秘布隆过滤器&#xff1a;高效数据查找与去重利器 引言 在现代计算机科学中&#xff0c;数据的查找与去重是一个至关重要的问题。本文将介绍一种高效的数据结构——布隆过滤器&#xff0c;它能够在海量数据中快速判断某个元素是否存在&#xff0c;同时具有出色的空间效率。…

动态调整系统主题色(4): CssVar 与 Variant 方案的探索

动态调整系统主题色(4): CssVar 与 Variant 方案的探索 动态调整系统主题色(4): CssVar 与 Variant 方案的探索 前言方案的介绍与比较 CssVar (CSS 变量方案)CSS 变量方案与 tailwindcss 的结合Variant 方案 2种方案在小程序上的示例之前的几篇 前言 这篇已经是动态调整系统…

深度学习模型部署与优化:策略与实践;L40S与A100、H100的对比分析

★深度学习、机器学习、生成式AI、深度神经网络、抽象学习、Seq2Seq、VAE、GAN、GPT、BERT、预训练语言模型、Transformer、ChatGPT、GenAI、多模态大模型、视觉大模型、TensorFlow、PyTorch、Batchnorm、Scale、Crop算子、L40S、A100、H100、A800、H800 随着生成式AI应用的迅猛…

python打开浏览器并模拟搜索

打开已存在的浏览器 打开已存在的浏览器有个很重要的作用就是&#xff0c;可以对于一些登录场景&#xff0c;提前登录好&#xff0c;不需要模拟登录了。 在命令行中执行打开chrome的命令&#xff0c;在图标上找到chrome的安装位置 在cmd命令行下执行命令 C:\Program Files\…

工厂管理软件中的计划排产是什么

一、计划排产的定义&#xff1a; 计划排产是指根据工厂的生产能力、订单需求和资源限制等因素&#xff0c;合理安排生产任务和时间&#xff0c;以实现高效的生产计划。它涉及到生产订单的分配、生产线的调度和资源的优化利用&#xff0c;旨在提高生产效率、缩短交货时间和降低…

高速公路堵车动力学

S/t trace 图可以分析牛顿力学时间序列的一切。 下例分析了当车距太小时&#xff0c;一个轻微的刹车扰动如何触发大堵车的&#xff1a; 堵车由以下因素促成&#xff1a; 刹车反应时间&#xff0c;刹车反应很快&#xff0c;看见灯即可&#xff0c;即使这样越往后刹车必须越狠&…

对于对象初始化的加深理解

一道有一定难度和挑战性的注重细节的有趣的面试题 目录 案例需求不同写法与角度下写法一写法二写法三写法四A类B类测试类 注参考视频 案例需求 不同写法与角度下 写法一 注&#xff1a;方法的修饰符为private package com.xie.interview;/*** 对象属性初始化相关的面试笔试题*…

Stable diffusion的架构解读(本博客还是以unet架构为主)

博客只是简单的记录一下自己学的&#xff0c;基于自己的一些情况&#xff0c;所以简单了一些只是将来忘记&#xff0c;用来回顾用。 论文的大体框架 unet结构位于 unet会接受prompt特征、latent特征、和t时间步特征&#xff0c;最后生成新一轮的特征 可以参考知乎大佬htt…

re学习(37)DASCTF 2023 0X401七月暑期挑战赛 controflow

程序通过改变栈里面的返回地址来控制程序的控制流 从而达到混淆的效果 左侧有许多被hook的函数 在每个函数开头设置断点 然后观察程序的运行流程 会发现输入的数据会进行 异或 相加 异或 相减 相乘 异或等操作 要注意部分运算的索引是 从[10]开始的 具体思路参考&#xf…

三十、【进阶】B-Trees的演变过程

1、索引结构 &#xff08;1&#xff09;二叉树 &#xff08;2&#xff09;B-Tree树 B-Tree树最大度数为5&#xff0c;代表每一个节点最多存储4个key(每个节点最多存储4个数据)&#xff0c;5个指针(可以指向5个子节点)。 2、演变过程&#xff08;最大度数为5&#xff09; &…

gorm 自定义时间、字符串数组类型

文章目录 自定义时间类型自定义字符串数组测试与完整代码测试代码测试结果 GORM 是GO语言中一款强大友好的ORM框架&#xff0c;但在使用过程中内置的数据类型不能满足以下两个需求&#xff0c;如下&#xff1a; time.Time类型返回的是 2023-10-03T09:12:08.5352808:00这种字符串…

基于Java的家政公司服务平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

在windows 10 里安装并设置了gvim 9.0

在windows 10 里安装并设置了gvim 9.0 。由于电脑里有联想软件商店&#xff0c;搜索vim&#xff0c;找到gvim 9.0 &#xff0c;顺利安装了该软件。安装好以后&#xff0c;打开该软件&#xff0c;界面背景是白色&#xff0c;字体小。因此在网上搜索&#xff1a;设置gvim背景&…