大话设计模式——24.迭代器模式(Iterator Pattern)

简介

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一)

UML图

在这里插入图片描述

应用场景
  • Java的集合对象:Collection、List、Map、Set等都有迭代器
  • Java ArrayList的迭代器源码
    在这里插入图片描述

示例

简单实现集合中的迭代器功能

  1. Iterator:
public interface Iterator {


    /**
     * 是否有下个元素
     *
     * @return
     */
    boolean hasNext();

    /**
     * 当前元素
     *
     * @return
     */
    Object next();

    /**
     * 删除元素
     *
     * @param obj
     */
    void remove(Object obj);
}
public class ListIterator implements Iterator {


    private List list;

    /**
     * 索引
     */
    private int index = 0;

    public ListIterator(List list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return index != list.size();
    }

    @Override
    public Object next() {
        Object obj = null;
        if (hasNext()) {
            obj = list.get(index);
            index++;
        }
        return obj;
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }
}
  1. Aggregate:
public interface ICollection {

    /**
     * 添加元素
     *
     * @param obj
     */
    void add(Object obj);

    /**
     * 删除元素
     *
     * @param obj
     */
    void remove(Object obj);

    /**
     * 迭代元素
     *
     * @return
     */
    Iterator iterator();
}
public class ListCollection implements ICollection {

    private List list = new ArrayList();

    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }

    @Override
    public Iterator iterator() {
        return new ListIterator(list);
    }
}

3.运行

public class Main {

    public static void main(String[] args) {
        ListCollection listCollection = new ListCollection();
        listCollection.add("aaaaaa");
        listCollection.add("bbbbbb");
        listCollection.add("cccccc");
        listCollection.add("dddddd");

        // 创建迭代器
        Iterator iterator = listCollection.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

在这里插入图片描述

总结

  • 优点

    • 可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
    • 支持以不同的方式遍历一个聚合对象
  • 缺点

    • 对于比较简单的遍历如数组、有序列表,该方式实现比较繁琐
    • 在遍历的同时更改迭代器所在的集合结构会导致异常

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营之LMDeploy 量化部署 LLM-VLM 实践

书生浦语大模型实战营之LMDeploy 量化部署 LLM-VLM 实践 创建开发机 打开InternStudio平台,创建开发机。 填写开发机名称;选择镜像Cuda12.2-conda;选择10% A100*1GPU;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像&#…

2024年腾讯云优惠活动大全

随着云计算技术的日益成熟,越来越多的企业和个人开始选择将业务和数据迁移到云端。作为国内领先的云服务提供商,腾讯云一直致力于为用户提供高效、稳定、安全的云服务体验。在2024年,腾讯云推出了一系列优惠活动,旨在让更多用户能…

了解Vue路由守卫

一、理解: 路由守卫就是通过URL访问组件的过程中,可以设置回调函数做拦截,判断是否允许该URL访问组件。这个过程出现的回调函数,我们叫做路由守卫钩子函数。 路由守卫有3种 1、全局路由守卫 在./router/index.js 文件中&#xff0…

Web服务器架构设计(学习笔记)

软件架构风格 质量属性与架构评估 Web架构综合考察 什么叫做架构风格?又有哪些架构风格?不同的架构风格的优劣如何? 有哪些层次的负载均衡实现?优劣如何? 有哪些层面的集群切片实现? 什么叫做小前端&#xff0c…

fs.1.10 ON CENTOS7 dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs.1.10的流程记录,本文使用dockerfile模式。 环境 docker engine:Version 24.0.6 centos docker:7 freeswitch:v1.10.7 dockerfile 创建空…

茴香豆:搭建你的 RAG 智能助理(笔记)

视频地址:https://www.bilibili.com/video/BV1QA4m1F7t4 文档地址:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md 作业地址:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/homework.md 茴香豆项目…

国外客户代采1688商品如何实现自动化对接

要实现国外客户代采1688商品的自动化对接,你可以考虑以下步骤: 选择合适的代采平台:选择一个适合你的需求和预算的代采平台,例如Alibaba.com、Amazon FBA代采等。 注册并创建账户:根据你选择的代采平台,注…

git 删除本地分支 删除远程仓库分支

语法&#xff1a; 删除本地分支 git branch -D <分支名>删除远程分支 git push <remote名称> <分支名> --delete 示例&#xff1a; 删除本地分支 git branch -D feature/test_listview删除远程分支 git push origin feature/test_listview --delete 两个…

java数组.day16(冒泡排序,稀疏数组)

冒泡排序 冒泡排序无疑是最为出名的排序算法之一&#xff0c;总共有八大排序! 冒泡的代码还是相当简单的&#xff0c;两层循环&#xff0c;外层冒泡轮数&#xff0c;里层依次比较&#xff0c;江湖中人人尽皆知。 我们看到嵌套循环&#xff0c;应该立马就可以得出这个算法的时…

Java简单实现一个LRU(最近最少使用淘汰策略)

目录 LRU介绍&#xff1a; 一些淘汰策略&#xff1a; Java简单实现LRU&#xff1a; 测试&#xff1a; ​编辑 实现原理&#xff1a; LRU介绍&#xff1a; LRU 是 "Least Recently Used" 的缩写&#xff0c;意为"最近最少使用"。它是计算机科学中的一种…

Linux 计算机网络

目录 一、网络协议 1、 "协议" 是一种约定 2、协议分层 二、网络模型 1、OSI七层模型 2、TCP/IP五层(或四层)模型 三、网络传输基本流程 四、数据包封装和分用 五、网络中的地址管理 六、网络编程套接字 1、理解源IP地址和目的IP地址 2、端口号 理解 &q…

console.log输出五彩斑斓的颜色

console.log 最经常使用它在控制台输出信息然后进行代码调试&#xff0c;会发现输出信息的颜色永远是黑色。本文教学如何用 console.log在控制台输出具有五彩斑斓颜色的信息。 单色输出 console.log(\x1B[31m红色\x1B[34m 蓝色) console.log(%c字符&#xff1a;, color:red, …

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网&#xff1a;https://www.ffmpeg.org/ 源码下载地址&#xff1a;https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境&#xff1a; sudo apt-get install build-essential nasm …

Can Transformer and GNN Help Each Other?

ABSTRACT 尽管 Transformer 在自然语言处理和计算机视觉方面取得了巨大成功&#xff0c;但由于两个重要原因&#xff0c;它很难推广到中大规模图数据&#xff1a;(i) 复杂性高。 (ii) 未能捕获复杂且纠缠的结构信息。在图表示学习中&#xff0c;图神经网络&#xff08;GNN&…

Vue中key的原理以及diff算法

简介&#xff1a;Vue的key用于在虚拟DOM中标记节点&#xff0c;方便后面的diff对比算法进行对比&#xff0c;提升效率。 Vue的vm或者vc实例一共管理着3个DOM对象&#xff0c;分别他的模板对应的真实DOM、真实DOM的备份、以及重新生成的新的DOM&#xff0c;后两个可以看成是虚拟…

Prometheus实现自定义脚本监控

#Prometheus# 监控路漫漫其修远兮&#xff0c;吾将上下而求索&#xff01; 一、前言 在监控工作过程中经常会收到大量的定制化的监控需求&#xff0c;Prometheus就提供了一个很强大的组件 --> Pushgateway&#xff0c;他不仅是网关的用途接收exporter的数据&#xff0c;还…

参与 PenPad Season 2 获得勋章,还有海量 Scroll 生态稀缺权益

PenPad 是 Scroll 生态中的首个 LaunchPad 平台&#xff0c;该平台继承了 Scroll 生态的技术优势&#xff0c;具备包括隐私在内的系列特点&#xff0c;同时且也被认为是 Scroll 生态最重要的价值入口之一。Penpad 与 Scroll 官方始终保持着合作&#xff0c;同时该项目自启动以来…

关于无人机,你必须知道的事!!(科技篇)

飞行器的五脏六腑 电机&#xff1a;无人机的动力单元&#xff0c;俗称“马达”。通过电机转动来驱动螺旋桨旋转&#xff0c;最终让飞机上天。 电调&#xff1a;无人机的动力单元&#xff0c;是接收油门信号并调整电机转速的控制枢纽&#xff0c;俗称电机的“黑屋调教师” 飞…

记录Http访问服务接口出现 301 Moved Permanently

记录Http访问服务接口出现 301 Moved Permanently 一、项目背景 ​ 在A服务中 需要通过远程调用 B服务接口 获取数据。A项目与B项目部署在不同的服务接口中。 请求接口响应界面 ​ 在调用B项目的接口时&#xff0c;响应的数据一直为 301 Moved Permanently Html代码&#x…

一文看懂Mac地址

一、Mac地址是什么&#xff1f; 虽然IP地址已经成为一个家喻户晓的术语&#xff0c;但还有一个同样重要的数字标识符值得我们关注——MAC地址。在本文中&#xff0c;我们旨在阐明网络中这个经常被忽视的方面。加入我们&#xff0c;深入研究 MAC 地址的世界&#xff0c;了解它们…