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

news2024/11/12 23:44:59

目录

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

请添加图片描述

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

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

能帮我们干什么?

主要解决什么问题?

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

优缺点

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

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


使用的场景

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

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

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

相关文章

uni-app:解决异步请求返回值问题

可以使用 Promise 或者回调函数来处理异步请求的返回值。 方法一&#xff1a; Promise处理异步请求的返回值 使用 Promise 可以将异步请求的结果通过 resolve 和 reject 返回&#xff0c;然后通过 .then() 方法获取成功的结果&#xff0c;通过 .catch() 方法获取错误信息。 …

ES Nested解释

参考博客 参考博客 nested类型是对象数据类型的专用版本&#xff0c;它允许对象数组以可以彼此独立查询的方式进行索引

React之diff原理

一、是什么 跟Vue一致&#xff0c;React通过引入Virtual DOM的概念&#xff0c;极大地避免无效的Dom操作&#xff0c;使我们的页面的构建效率提到了极大的提升 而diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处 传统diff算法通过循环递归对节点进行依…

为什么亚马逊卖家一定要有独立站?新手低成本快速搭建跨境电商独立站完整图文教程

效果展示 翻译助手 一、购买域名 二、购买主机托管 三、搭建独立网站 四、网站装修设计 五、网站迁移 六、补充 前言&#xff1a;为什么亚马逊卖家一定要有独立站&#xff1f; 先来谈谈为什么亚马逊卖家一定得有独立站&#xff0c;从我一些个人经历来看&#xff0c;有独…

C语言程序设计——题目:用*号输出字母C的图案。程序分析:可先用‘*‘号在纸上写出字母C,再分行输出。

题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 #include<stdio.h> int main() {printf(" *****\n");printf(" *\n");printf("*\n");printf("*\n");printf(&…

如何一键核实验证身份证的真伪?

据报道&#xff0c;今年10月10日&#xff0c;广东省佛山市朱某因生活琐事与丈夫发生争吵&#xff0c;民警发现她的身份证有问题。 在民警打算进一步了解情况&#xff0c;查看夫妻二人的身份证件时&#xff0c;朱某的身份证引起了民警的注意。这张身份证表面很光滑&#xff0c;…

【JAVA学习笔记】34 - 房屋出租系统(综合性强)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_chapter09/src/com/yinhai/houserent 一、项目需求说明 实现基于文本界面的房屋出租系统&#xff0c;能够实现对房屋信息的添加、修改和删除&#xff08;用数组实现&#xff09;&#xff0c;并能够…

大学兼职教师管理系统 用JAVA语言开发

一、项目介绍 基于VueSpringBootMySQL的大学兼职教师管理系统包含学生管理、教师管理、课程档案管理、课程评价管理、课程考勤管理、授课管理、课程成绩管理教龄/薪资分析可视化图表&#xff0c;还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管…

canal五部曲-canal是如何处理insert幂等性的

canal使用了Rocketmq来接收mysql采集的binlog的事件&#xff0c;做到采集和处理的解耦。同时满足一次采集多方消费的需求。那么既然使用到Rocketmq就一定会存在MQ消费超时或是处理失败MQ重发的问题。 那么canal是如何处理MQ重复消费幂等性问题的呢 一般&#xff0c;在业务上我…

网络安全保险行业面临的挑战与变革

保险业内大多数资产类别的数据可以追溯到几个世纪以前&#xff1b;然而&#xff0c;网络安全保险业仍处于初级阶段。由于勒索软件攻击、高度复杂的黑客和昂贵的数据泄漏事件不断增加&#xff0c;许多网络安全保险提供商开始感到害怕继续承保更多业务。 保险行业 根据最近的路…

电脑每过几天就要自动更新,一键教你解决

windows更新&#xff0c;暂停更新最多只能选5个周&#xff0c;还是很麻烦&#xff0c;那么看下图&#xff0c;教你如何改为10年后&#xff1b; 建立一个txt文件&#xff0c;复制下述内容&#xff0c;然后保存&#xff0c;再把后缀名改为.reg,运行一下就可以轻松改为10年了&…

Python爬虫网易云音乐,Tkinter制作音乐播放器

目录 一、效果展示 二、环境 三、实现过程 四、源码 一、效果展示 页面的美化以及功能还有待升级~ 先来说一下已有功能吧&#xff1a; 可以在搜索框中通过歌曲或歌手名称进行搜索&#xff0c;效果和在网易云官网搜索一样。 点击开始下载&#xff0c;就会将搜索结果的第一…

小程序实现圆环进度

一&#xff1a;需求 小程序中要展示进度&#xff0c;要求类似示例图&#xff0c;用圆环形式展示进度&#xff0c;那这该如何实现呢&#xff1f;这一篇文章主要讲的就是这样一个功能。 二&#xff1a;实现 实现的大致流程是把圆环进度条封装成一个组件&#xff0c;然后在需要使…

【开源框架】Glide的图片加载流程

引入依赖 以下的所有分析都是基于此版本的Glide分析 //引入第三方库glide implementation com.github.bumptech.glide:glide:4.11.0 annotationProcessor com.github.bumptech.glide:compiler:4.11.0分析 Glide的使用就是短短的一行代码 Glide.with(this).load("xxx&q…

Dell R720服务器已有win10系统下安装Ubuntu10.04双系统

先在win10下进磁盘管理&#xff0c;分配空间 重启电脑&#xff0c;开机时按F11进入BIOS。 one-shot boot&#xff0c;选U盘 datatraveler 我原来装的是ubuntu18&#xff0c;ubuntu18升级成了ubuntu20&#xff0c;但是apt-get upgrade有很多问题&#xff0c;所以只能重装。 …

数据结构与算法之矩阵: Leetcode 134. 螺旋矩阵 (Typescript版)

螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示…

第19章 Dubbo

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

ke8学校陈老师H5

目录 例一&#xff1a; 1label for与表单元素建立关联 2鼠标选中区域 3classlist属性&#xff1a;更换类选择器。添加、删除、切换和查询一个元素上的类。 4nextElementSibling属性 5title属性&#xff1a;鼠标放上去会有提示信息 6placeholder属性&#xff1a;填了就有…

Linux常用命令——cksum命令

在线Linux命令查询工具 cksum 检查文件的CRC是否正确 补充说明 cksum命令是检查文件的CRC是否正确&#xff0c;确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来&#xff0c;在目的系统中又被计算一次&#xff0c;两个数字进行…

【RuoYi-Vue-Plus】学习笔记 50 - 集成 JSEncrypt 实现请求加密传输(源码)

文章目录 前言框架版本前端服务端 框架集成前端集成1、总览2、代码实现服务端集成1、总览2、代码实现2.1、配置信息 application.yml2.2、配置类 ApiDecryptProperties2.3、过滤器 CryptoFilter2.4、包装类 DecryptRequestBodyWrapper2.5、加解密工具类 EncryptUtils2.6、自动装…