迭代器模式(行为型)

news2024/11/15 17:39:20

目录

一、前言

二、迭代器模式

三、总结


一、前言

        迭代器模式(Iterator Pattern)是一种行为型设计模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。总的来说就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

        迭代器模式由以下角色组成:

Iterator(抽象迭代器):

定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素

Concrete Iterator(具体迭代器):

它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素

Aggregate(抽象聚合器):

一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。

ConcreteAggregate(具体聚合器):

就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

        整个迭代器模式的结构图:

二、迭代器模式

        迭代器实际上在现有的语言中基本都有实现,比如java里面的foreach,如果使用到了foreach,查看.class文件,可以发现编译后的实际是使用Iterator进行的迭代遍历:

        这里就简单模拟List<String>的迭代器。

        首先创建类Iterator:

public interface Iterator<T> {

    T next();

    boolean hasNext();
}

        具体的实现类ConcreteIterator:

public class ConcreteIterator<T> implements Iterator{
    private List<T> aggregate;

    private int index;

    public ConcreteIterator(List<T> aggregate) {
        this.aggregate = aggregate;
    }

    @Override
    public T next() {
        return aggregate.get(index++);
    }

    @Override
    public boolean hasNext() {
        return index < aggregate.size() ? true : false;
    }
}

        再创建Aggregate类:

public interface Aggregate<T> {
   void add(T str);

   Iterator<T> getIterator();
}

        具体的实现ConcreteAggregate类:

public class ConcreteAggregate<T> implements Aggregate{

    private List<T> aggregate;

    public ConcreteAggregate() {
        this.aggregate = new ArrayList<>();
    }


    @Override
    public void add(Object item) {
        this.aggregate.add((T) item);
    }

    @Override
    public Iterator<T> getIterator() {
        return new ConcreteIterator(this.aggregate);
    }
}

        客户端调用:

public class Client {
    public static void main(String[] args) {

        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("1");
        aggregate.add("2");

        Iterator iterator = aggregate.getIterator();

        while (iterator.hasNext()){
            Object s = iterator.next();
            System.out.println(s);
        }
    }
}

        运行结果:

三、总结

        优点与缺点:

优点:

1、简化遍历:迭代器模式提供了一种统一的方法来遍历各种聚合对象,客户端代码不需要了解聚合对象的具体实现

2、解耦遍历算法和集合结构通过引入迭代器,集合对象和遍历算法分离,集合对象不需要实现遍历逻辑,这提高了代码的模块化和复用性

3、多种遍历方式可以为同一个集合提供不同的迭代器,实现多种遍历方式(如正向遍历、反向遍历)

4、一致接口所有的集合都可以提供相同的迭代器接口,客户端可以以相同的方式遍历不同类型的集合,提升了代码的灵活性和可维护性

5、并发支持某些迭代器可以支持并发遍历,允许在多线程环境中安全地遍历集合

缺点:

1、开销增加由于引入了迭代器对象,会增加额外的类和对象,从而增加了系统的复杂性和内存开销。

2、外部迭代器复杂性在某些情况下,使用外部迭代器(显式控制迭代过程)会使代码变得复杂,特别是在需要嵌套迭代或管理迭代状态时。

3、对变化敏感如果在迭代过程中集合结构发生变化(如增删元素),需要处理并发修改的问题,可能会引入额外的同步机制和复杂性。

        应用场景:

1、遍历集合对象:需要遍历不同类型的集合对象(如数组、链表、树、图等)时,使用迭代器模式可以提供统一的遍历方式。

2、隐藏集合内部实现:当不希望客户端了解或依赖集合对象的内部结构时,可以使用迭代器模式隐藏内部实现细节。

3、多种遍历需求:需要对同一集合对象进行多种不同方式的遍历时,可以定义多个不同类型的迭代器来满足需求。

4、复杂聚合对象:对于一些复杂的聚合对象,如组合模式(Composite Pattern)中的树形结构,迭代器模式可以提供一种简单的遍历方法。

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

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

相关文章

AutoCAD Electrical电气版 2018 2019 2020 20212022远程安装服务

购买流程&#xff1a; ①进店沟通需求 ②协商服务内容 ③拍下订单 ④远程安装服务 常用版本2015&#xff0c;2016&#xff0c;2018&#xff0c;2019&#xff0c;2020&#xff0c;2021&#xff0c;2022。 适用&#xff1a;WIN 7/8/10/11系统用户购买 系统支持推荐 WIN7&…

【数据分析面试】54.员工信息(HR)数据库搭建

题目 由于发展需求&#xff0c;进一步提高公司人员统筹管理的能力&#xff0c;公司决定要重新升级人力数据管理系统。 现在&#xff0c;你的任务是为公司重新设计和搭建一个员工信息数据库。 提示&#xff1a;考虑HR管理系统的功能&#xff0c;比如人员信息、入职时间、离职…

shell脚本【免交互】

目录 1. Here Document 免交互 1.1 Here Document概述 1.2 实验操练 1.3 tee命令 ​1.4 变量替换 ​ 2. expect 免交互 2.2 实验操练 1. Here Document 免交互 1.1 Here Document概述 *使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、…

clickhouse——clickhouse单节点部署及基础命令介绍

clickhouse支持运行在主流的64位CPU架构的linux操作系统之上&#xff0c;可以通过源码编译&#xff0c;预编译压缩包&#xff0c;docker镜像和rpm等多种方式进行安装。 一、单节点部署 1、安装curl工具 yum install -y curl 2、添加clickhouse的yum镜像 curl -s https://pack…

5V降3.3V或3V恒压1A芯片WT6015

5V降3.3V或3V恒压1A芯片WT6015 WT6015 是一款采用恒定频率、电流模式架构的高效单片同步降压稳压器。该设备有可调节版本。无负 载时的电源电流为 40uA&#xff0c;关断时降至 <1uA。 2.5V 至 5.5V 输入电压范围使 WT6015 非常适合单节锂离 子电池供电的应用。 100% 占空比…

第八课,分支语句嵌套、随机数函数、初识while循环

一&#xff0c;分支结构的嵌套语法 在 Python 中&#xff0c;分支结构可以嵌套&#xff0c;这意味着你可以在一个条件语句中包含另一个条件语句。嵌套的分支结构可以让你更灵活地控制程序的逻辑流程。 怎么理解呢&#xff1f;打个比方&#xff1a;放学后&#xff0c;请三年级…

macOS上编译android的ffmpeg及ffmpeg.c

1 前言 前段时间介绍过使用xcode和qt creator编译调试ffmepg.c&#xff0c;运行平台是在macOS上&#xff0c;本文拟介绍下android平台如何用NDK编译链编译ffmepg库并使用。 macOS上使用qt creator编译调试ffmpeg.c macOS上将ffmpeg.c编译成Framework 大体思路&#xff1a; 其…

【数据结构】链式二叉树(超详细)

文章目录 前言二叉树的链式结构二叉树的遍历方式二叉树的深度优先遍历前序遍历(先根遍历)中序遍历(中根遍历)后序遍历(后根遍历) 二叉树的广度优先遍历层序遍历 二叉树链式结构接口实现二叉树结点个数二叉树叶子结点个数二叉树的深度&#xff08;高度&#xff09;二叉树第k层结…

R18 NTN中的RACH-less HO

在看R18 38.300时,发现NTN场景 增加了如下黄色字体的内容,R18 NTN支持了RACH-less HO,索性就简单看了看。 NTN RACH less HO相关的描述主要在38.331,38.213和38.321中。38.300中的描述显示:网络侧会通过RRCReconfiguration消息将RACH-less HO相关的配置下发给UE, 其中会包…

Linux入侵应急响应与排查

入侵者在入侵成功后&#xff0c;往往会留下后门以便再次访问被入侵的系统&#xff0c; 而创建系统账号是一种比较常见的后门方式。 查询特权用户特权用户(uid 为0) awk -F: $30{print $1} /etc/passwd 查找远程可以登录的账户 awk /\$1|\$5|\$6/{print $1} /etc/shadow $1&a…

仿真APP在微波加热仿真分析中的应用

一、背景介绍 微波炉是一种常用的食物加热工具&#xff0c;主要是由腔室、磁控管、波导管三个部分组成。在工作过程中&#xff0c;磁控管产生波长约为12.2cm的微波&#xff08;对应频率2.45GHz&#xff09;&#xff0c;通过波导管注入腔室内&#xff0c;在腔室内产生振荡的磁场…

echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码

效果图 实现代码 开启点击柱子时的提示内容 //完整写法请看下面tooltip: {trigger: axis,axisPointer: {type: shadow}},自定义提示内容 //完整写法请看下面formatter: function (param) {// param是悬浮窗所在的数据&#xff08;x、y轴数据&#xff09;let relVal "&…

【LeeCode算法】第67题:二进制求和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;将a和b两个字符串转换成十进制&#xff0c;然后将相加的结果转换回文本的二进制。 2. 代码&#xff1a; char* addBinary(char* a, char* b) {int a_len strlen(a);i…

P3-P6容器之分类与各种测试

序列容器 关联式容器 这里讲到的哈希碰撞&#xff0c;是两个元素的存放位置冲突&#xff0c;用链表进行处理&#xff1b;同时hashtable的链表不能太长 以下测试程序之辅助函数 一、序列容器 array vector vector容量是两倍增长&#xff0c; 当添加元素之后&#xff0c;容…

什么样的跨网文件交换系统适合车企行业?

对于汽车行业而言&#xff0c;随着市场的全球化&#xff0c;产品和数据的跨网流通已成为常态。在这个过程中&#xff0c;跨网文件交换系统成为了连接全球供应链、加速产品开发周期、确保数据安全的不可或缺的桥梁。但什么样的系统才能真正满足车企的严苛要求呢&#xff1f;让我…

阿里通义千问大模型AI接入火车头自动生成内容插件

插件特点&#xff1a; 可以根据采集的关键词&#xff0c;自动生成文章可自定义提示词 也可以分析标题重写一个标题2个提问标签 如有需要可自由增加对话标签自己可以设置TXT关键词导入&#xff0c;自动采集生成 安装说明&#xff1a; 1.需要python环境 &#xff0c;具体可以…

【CSDN独家公开】Python解析.SchDoc格式文件转换为json文件

前情提要 因工作需求&#xff0c;需要解析.SchDoc格式文件&#xff0c;提取文本和位置关系&#xff0c;通常方式是转换为图片或PDF&#xff0c;再进行OCR&#xff0c;但是这样识别精度太低了 Github找了好些项目&#xff0c;都不支持 PyAltium不支持 https://github.com/plu…

docker安装应用

软件安装步骤可以在docker的官网查找&#xff1a; https://hub.docker.com/1.安装tomcat 这里演示用的最新版&#xff0c;版本是10.0.14 1.拉取镜像 docker pull tomcat 直接下载最新版 [rootlocalhost ~]# docker pull tomcat Using default tag: latest latest: Pulling f…

Discuz!X3.4论坛网站公安备案号怎样放到网站底部?

Discuz&#xff01;网站的工信部备案号都知道在后台——全局——站点信息——网站备案信息代码填写&#xff0c;那公安备案号要添加在哪里呢&#xff1f;并没有看到公安备案号填写栏&#xff0c;今天驰网飞飞和你分享 1&#xff09;工信部备案号和公安备案号统一填写到网站备案…

8. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上&#xff0c;CPU是多核的&#xff0c;上述epoll实现方式只使用了其中的一个核&#xff0c;造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…