二十、设计模式之迭代器模式

目录

  • 二十、设计模式之迭代器模式
    • 能帮我们干什么?
      • 主要解决什么问题?
      • 优缺点
        • 优点
        • 缺点:
    • 使用的场景
      • 角色
    • 实现
      • 迭代器模式
        • 定义迭代器
        • 容器实现可迭代接口
        • 迭代器实现
        • 使用
    • 总结

请添加图片描述

二十、设计模式之迭代器模式

所属类型定义
行为型提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示

能帮我们干什么?

主要解决什么问题?

主要解决的是 不同的方式来遍历整个整合对象
何时使用:遍历一个聚合对象。

优缺点

优点
  • 单一职责原则。通过将体积庞大的遍历算法代码抽取为独立的类,可对客户端代码和集合进行整理。
  • 开闭原则。可实现新型的集合和迭代器并将其传递给现有代码,无需修改现有代码。
  • 可以并行遍历同一集合,因为每个迭代器对象都包含其自身的遍历状态。
    相似的,可以暂停遍历并在需要时继续。
缺点:

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。


使用的场景

1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。

角色

二、角色组成

  • 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素。
  • 具体迭代器(Concrete Iterator):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
  • 抽象聚合器(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体聚合器(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

实现

如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。

代码案例
https://gitcode.net/k316378085/Java/-/tree/master/java/com/kongxiang/raindrop/dp/type/behavior/iterator

迭代器模式

容器返回迭代器实例
迭代器由每个容器自己单独实现

实现难度: ⭐️ ⭐️ ⭐️
请添加图片描述

定义迭代器
/**
 * 可迭代的。提供一个迭代器实例
 * @param <T>
 */
public interface Iterable<T>{

    public Iterator<T> iterator();
}

/**
 * 定义迭代器的两个方法
 * @param <T>
 */
public interface Iterator<T> {

    public boolean hasNext();

    public T next();
}
容器实现可迭代接口
public class ListContainer<T> implements Iterable<T> {
    private List<T> list = new ArrayList<>();

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

    public void add(T t ){
        this.list.add(t);
    }

    public T get(int index){
        return  this.list.get(index);
    }

    public int size(){
      return   this.list.size();
    }
}


迭代器实现
public class ListIterator<T> implements Iterator<T> {

    private ListContainer<T> list   ;

    public ListIterator(ListContainer<T> list){
        this.list = list;
    }

    private int pointer;

    @Override
    public boolean hasNext() {
        return pointer < list.size();
    }

    @Override
    public T next() {
        return list.get(pointer++);
    }
}

使用
public static void main(String[] args) {
        ListContainer<Integer> listContainer = new ListContainer<>();
        listContainer.add(1);
        listContainer.add(2);
        listContainer.add(3);
        listContainer.add(6);

        Iterator<Integer> iterator = listContainer.iterator();
        while (iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println("--- : "+ next);
        }
    }
 

总结

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

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

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

相关文章

2023/10/23 mysql学习

数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2)

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder&#xff0c;Kotlin&#xff08;2&#xff09; import android.graphics.Canvas import android.graphics.Point import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util…

第19章 Dubbo

本文中所有的原理及流程都是针对Dubbo3.0.2.1版本 19.1 谈谈你对Dubbo的理解 难度:★★★★ 重点:★★ 白话解析 1、背景:参考18.13题,这里不在赘述。 2、简介:Dubbo在3.x版本之前都只是一个高性能的RPC框架,但是在3.x版本之后,官网的描述变了,Dubbo已经升级成一个等…

【网络协议】聊聊UDP协议

前面的几篇文章讲述了链路层和IP层&#xff0c;主要的话其实就是MAC地址&#xff0c;以及通过IP地址求MAC地址的ARP协议。PING的底层协议 ICMP 。动态分配IP协议 DHCP等。而从今天开始我们开始讲述传输层协议&#xff0c;传输层主要就是UDP和TCP。 TCP 和 UDP 有哪些区别&…

计算机视觉-数学基础*变换域表示

被研究最多的图像&#xff08;或任何序列数据&#xff09;变换域表示是通过傅 里叶分析 。所谓的傅里叶表示就是使用 正弦函数的线性组合来表示信号。对于一个给定的图像I(n1,n2) &#xff0c;可以用如下方式分解它&#xff08;即逆傅里叶变换&#xff09;&#xff1a; 其中&a…

Spring Boot和XXL-Job:高效定时任务管理

Spring Boot和XXL-Job&#xff1a;高效定时任务管理 前言第一&#xff1a;XXL-Job简介什么是XXL-job对比别的任务调度 第二&#xff1a; springboot整合XXL-job配置XXL-Job Admin拉取XXL-Job代码修改拉取的配置 配置执行器自己的项目如何整合maven依赖properties文件配置执行器…

整数智能·迪拜GITEX 2023 |探索未来科技,感受创新脉搏

第43届GITEX GLOBAL在迪拜世界贸易中心盛大开幕&#xff0c;聚集来自全球各地的6000多家参展企业&#xff0c;包含大量来自于人工智能、区块链、网络安全、可持续技术等领域的科技巨头和革命性初创企业&#xff0c;展示全球科技最新趋势和创新机遇。GITEX GLOBAL始办于1981年&a…

【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下

【解决】设置pip安装依赖包路径默认路径在conda路径下&#xff0c;而不是C盘路径下 问题描述 在win11下安装miniconda&#xff0c;在conda环境里使用pip安装&#xff0c;依赖包总是安装到C盘路径&#xff0c;如 C:\Users\Jimmy\AppData\Local\Programs\Python\Python311\Lib\…

【图灵诸葛】jvm笔记

2023年10月23日14:04:44 jvm 1.jdk体系结构图回顾(Av333129672,P1) jdk jre 底层是hotspot jvm 2.java虚拟机内部组成(Av333129672,P2) 堆 方法区 执行引擎 类加载 本地方法栈 线程栈&#xff08;虚拟机栈&#xff09; 3.java虚拟机栈讲解(Av333129672,P3) 程序计数器&#xf…

【iOS逆向与安全】某音App直播间自动发666 和 懒人自动看视频

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就花了几分钟做了一个。 2.操作环境 越狱iPhone一台 frida m…

循环队列c语言版

一、循环队列结构体 typedef int QueueDataType; #define CQ_MAX_SIZE 10typedef struct CircularQueue {QueueDataType data[CQ_MAX_SIZE];/**标记队列首*/QueueDataType head;/**标记队列尾部*/QueueDataType rear;} CircularQueue; 二、循环队列操作函数声明 /**创建队…

身份证读卡器ubuntu虚拟机实现RK3399 Arm Linux开发板交叉编译libdonsee.so找不到libusb解决办法

昨天一个客户要在RK3399 Linux开发板上面使用身份证读卡器&#xff0c;由于没有客户的开发板&#xff0c;故只能用本机ubuntu虚拟机来交叉编译&#xff0c;用客户发过来的交叉编译工具&#xff0c;已经编译好libusb然后编译libdonsee.so的时候提示找不到libusb&#xff0c;报错…

使用GoogleNet网络实现花朵分类

一.数据集准备 新建一个项目文件夹GoogleNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图&#xff0c;目前企业中有20个VLAN, 编号为VLAN1&#xff5e;VLAN20, 为了确保内部网络的可靠性&#xff0c;使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽&#xff0c;现管理员希望通过配置MSTP 的负载均衡实现网络带宽…

MySQL---表的增查改删(CRUD基础)

文章目录 什么是CRUD&#xff1f;新增&#xff08;Create&#xff09;单行数据 全列插入多行数据 指定列插入 查询&#xff08;Retrieve&#xff09;全列查询指定列查询查询字段为表达式起别名查询去重查询排序查询条件查询分页查询 修改&#xff08;Update&#xff09;删除&…

运维 | 使用 Docker 安装 Jenkins | Jenkins

运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins&#xff0c;仅作为记录与参考&#xff0c;希望对大家有所帮助。 准备工作 系统&#xff1a;CentOS 7.9配置&#xff1a;4c8g 快速安装 下面以 Docker 方式安装 Jenkin…

DCU上如何运行大模型以及用到的docker命令

第一步&#xff1a;需要连接到官方(https://developer.hpccube.com/)提供的vpn 第二步&#xff1a;通过termius进入到项目 第三步&#xff1a;遇到问题 1.docker空间太小了&#xff0c;得换地方&#xff1a;参考这个centos设置docker 目录_mob64ca12f73101的技术博客_51CTO博…

【Qt样式(qss)-5】qss混乱,错乱,不生效的一种原因

前言&#xff1a; 之前写过一些关于qss的文章&#xff1a; 【Qt样式&#xff08;qss&#xff09;-1】手册小结&#xff08;附例&#xff1a;软件深色模式&#xff09;_深蓝色主题qss表-CSDN博客 【Qt样式&#xff08;qss&#xff09;-2】使用小结&#xff08;软件换肤&#…

算法、语言混编、分布式锁与分布式ID、IO模型

一、算法初识 数据结构和算法是程序的基石。我们使用的所有数据类型就是一种数据结构&#xff08;数据的组织形式&#xff09;&#xff0c;写的程序逻辑就是算法。 算法是指用来操作数据、解决程序问题的一组方法。 对于同一个问题&#xff0c;使用不同的算法&#xff0c;也…

实验六:DHCP、DNS、Apache、FTP服务器的安装和配置

1. (其它) 掌握Linux下DHCP、DNS、Apache、FTP服务器的安装和配置&#xff0c;在Linux服务器上部署JavaWeb应用 完成单元八的实训内容。 1、安装 JDK 2、安装 MySQL 3、部署JavaWeb应用 安装jdk 教程连接&#xff1a;linux安装jdk8详细步骤-CSDN博客 Jdk来源&#xff1a;linu…