当前位置: 首页 >  网技达人 >  Iterator模式

Iterator模式

导读:Part1 ITerator模式.作用:循环不依赖具体的集合实现,扩展性比较好。.1.1 Iterator模式.使用Java语言显示数据arr中的元素时,我们可以使用下面的for循环语句遍历数组。.for (int i = 0; i < arr.length; i++) {.Sy

Part1 ITerator模式

作用:循环不依赖具体的集合实现,扩展性比较好。

1.1 Iterator模式

使用Java语言显示数据arr中的元素时,我们可以使用下面的for循环语句遍历数组。

for (int i = 0; i < arr.length; i++) {
    System.out.println("i = " + i);
  }

将此处i的作用抽象化、通化后形成的模式,在设计模式中称为Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合。英语中Iterator意味反复做某事,汉语中称之为“迭代器”。

1.2 示例程序

来看一段实现了Iterator模式的示例程序。这段示例程序的作用是将书(Book)放到书架(Bookshelf)中,并将书的名字按顺序显示出来。

Iterator模式重点概念:

名称 说明 角色
Aggregate 接口 表示集合的接口 集合
Iterator 接口 遍历集合的接口 迭代器
Book 类 表示 书的类
BookShelf 类 表示书架类 具体的集合
BookShelfIterator 类 表示遍历书架的类 具体的迭代器

类图说明

代码清单1-1 Aggregate接口

public interface Aggregate {
	public abstract Iterator iterator();
}

在Aggregate接口中声明的方法只有一个——iterator()方法。该方法会生成一个用于遍历集合的迭代器。
想要遍历集合中的元素时,调用Aggregate#iterator() 方法来生成一个实现了Iterator接口的 类的实例。
代码清单1-2 Iterator接口

public interface Iterator {
    Boolean hasNext();
    Object next();
}

hasNext()是否还存在元素,用来控制是否需要进行下次遍历。
next()方法,获取当前下标位置的对象,并移动下标位置。
代码清单1-3 Book类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    String name;
}

Book实体类
代码清单1-4 BookShelf

@Data
public class BookShelf implements Aggregate{
    Book[] books;
    Integer last = 0;
    public BookShelf(Integer maxSize) {
        this.books = new Book[maxSize];
    }
    public Book getIndexAt(Integer index){
        return books[index];
    }
    public void appendBook(Book book){
        this.books[last] = book;
        last++;
    }

    public Integer getLength(){
        return last;
    }
    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

书架实体类。 需要将此类作为集合处理,所以需要继承集合类Aggregate,实现获取迭代器方法iterator();
代码清单1-5 BookShelfIterator

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    @Override
    public Boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return Boolean.TRUE;
        }else {
            return Boolean.FALSE;
        }
    }
    @Override
    public Object next() {
        Book book = bookShelf.getIndexAt(index);
        index++;
        return book;
    }
}

用于遍历书架的类,需要有遍历功能因此继承了Iterator接口。

  1. 初始化时,bookShelf 属性表明需要遍历的书架;index 属性表明下表的位置,初始化为0。

  2. hasNext()方法需要返回是否还有下一个元素要处理,True代表有,False代表没有。使用index和getLength()总册数的对比来判断。

  3. next() 方法获取当前下标位置的对象用做返回,并且移动下标到下个位置。
    代码清单1-5 main函数

    public class Main { public static void main(String[] args) { BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book(“《西游记》”)); bookShelf.appendBook(new Book(“《红楼梦》”)); bookShelf.appendBook(new Book(“《三国演义》”)); bookShelf.appendBook(new Book(“《水浒传》”));

        Iterator it = bookShelf.iterator();
        while(it.hasNext()){
            Book next = (Book)it.next();
            System.out.println("next = " + next);
        }
    }
    

    }

main函数可以看出,整个while循环只调用了hasNext()和next()方法,并不依赖BookShelf具体的集合对象。如果集合对象发生变化,不影响这部分代码。扩展性比较好。

内容
  • Docker-Compose部署Gitlab以及Gitlab配置SMTP邮件服务
    Docker-Compose部署
    2023-12-12
    使用Docker-Compose部署Gitlab.拉取镜像.地址: https://hub.docker.com/r/g
  • 代码审计工具Fortify基本使用
    代码审计工具Fortify基本使
    2023-12-11
    最近接触到一款代码审计的工具 — Fortify SCA and Applications 22.2.0,现就其基本使用
  • c++ function使用
    c++ function使用
    2023-12-11
    一、function介绍.funciotn是从c++11开始支持的特性,使用它需要包含头文件.在cppreference
  • gitlab ci 集成 eslint/prettier/tsc 做代码审查,并使用 eslint 输出作为显示代码质量
    gitlab ci 集成 esl
    2023-12-09
    前言.想自动化一下公司里代码的部分审查,最初想用 reviewdog 的,但是公司的域名基本都在 VPN 中访问的,gi
  • CesiumJS 源码杂谈 - 时间与时钟系统
    CesiumJS 源码杂谈 -
    2023-12-08
    目录.1. 时间的“诞生”.2. 时间的推进.3. Entity API 与 Property API 的更新动力源.4
  • 等保测评之主机测评——Windows Sever
    等保测评之主机测评——Windo
    2023-12-08
    目录.(一)身份鉴别.(二)访问控制.(三)安全审计.(四)入侵防范.(五)恶意代码防范.(六)可信验证.(七)数据完整
  • 读发布!设计与部署稳定的分布式系统(第2版)笔记26_安全性上
    读发布!设计与部署稳定的分布式系
    2023-12-07
    1. 安全问题.1.1. 系统违规并不总是涉及数据获取,有时会出现植入假数据,例如假身份或假运输文件.1.2. 必须在整
  • 联邦GNN综述与经典算法介绍
    联邦GNN综述与经典算法介绍
    2023-12-07
    作者:京东科技 李杰.联邦学习和GNN都是当前AI领域的研究热点。联邦学习的多个参与方可以在不泄露原始数据的情况下,安全
  • keras图片数字识别入门AI机器学习
    keras图片数字识别入门AI机
    2023-12-07
    通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程。.本例子,要基于mnis
  • Hutool:一行代码搞定数据脱敏
    Hutool:一行代码搞定数据脱
    2023-12-07
    1. 什么是数据脱敏.1.1 数据脱敏的定义.数据脱敏百度百科中是这样定义的:.数据脱敏,指对某些敏感信息通过脱敏规则进
  • 一种配置化的数据脱敏与反脱敏框架实现
    一种配置化的数据脱敏与反脱敏框架
    2023-12-07
    1.tony框架背景.在业务量日益剧增的背景下,大量数据在各种业务活动中产生,数据安全控制一直是治理的重要环节,数据脱敏
  • 使用GetDIBits()获取Windows位图数据的标准用法,解决内存、堆栈报错问题
    使用GetDIBits()获取W
    2023-12-06
    获取图标的位图数据.分两次使用GetDIBits(),以便于正确设置缓存的大小.正确设置BITMAPINFO的大小,否则
  • 小波去噪算法的简易实现及其扩展(小波锐化、高斯拉普拉斯金字塔去噪及锐化)之二。
    

SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)
    小波去噪算法的简易实现及其扩展(
    2023-12-06
    上一篇文章谈及了GIMP里实现的小波分解,但是这仅仅是把图像分解为多层的数据,如果快速的获取分解数据以及后续怎么利用这些
  • 使用unplugin-auto-import自动导入插件优化vite开发vue3应用
    使用unplugin-auto-
    2023-12-06
    为什么要使用unplugin-auto-import插件?.使用vite编写vue3代码时,使用composition
  • 不清除手机数据怎么解锁锁屏密码
    不清除手机数据怎么解锁锁屏密码
    2023-12-06
    不清除手机数据怎么解锁锁屏密码.在现代社会中,手机已经成为我们生活中不可或缺的一部分。然而,有时我们可能会遇到忘记锁屏密
  • 智能物联网时代里信息存储、处理和传输方式的变化浅谈
    智能物联网时代里信息存储、处理和
    2023-12-06
    智能物联网时代里信息存储、处理和传输方式的变化浅谈.在智能物联网时代,信息存储、处理和传输的方式将发生重大变化。以下是一
  • 开发环境篇之HALCON数据结构
    开发环境篇之HALCON数据结构
    2023-12-05
    开发环境篇之HALCON基础.目录.基本数据分类.图标类数据.Image(图片).Pixel:像素.Channel:通道
  • 虹科案例 | 丝芙兰xDomo:全球美妆巨头商业智能新玩法
    虹科案例 | 丝芙兰xDomo:
    2023-12-05
    全球美妆行业的佼佼者丝芙兰,其走向成功绝非仅依靠品牌知名度和营销手段。身为数据驱动型企业,2018年以来,丝芙兰就率先在
  • colmap 初体验🫠🎶
    colmap 初体验🫠🎶
    2023-12-05
    安装:Installation — COLMAP 3.9-dev documentation.使用:Tutorial —
  • ManageEngine ServiceDesk Plus之CVE漏洞
    ManageEngine Ser
    2023-12-05
    什么是CVE?.CVE的英文全称是“Common Vulnerabilities &.Exposures”即通用漏洞披露
  • 休闲简约短袖衬衫
    休闲简约短袖衬衫
    2023-12-21
    休闲简约短袖衬衫.现代人生活节奏快,休闲简约的穿着成为时尚潮流。短袖衬衫作为经典的休闲单品,一直备受时尚人士的青睐。它舒
  • 时尚牛仔裤,展现随性休闲风格
    时尚牛仔裤,展现随性休闲风格
    2024-01-10
    时尚牛仔裤,展现随性休闲风格.时尚牛仔裤一直是时装界的宠儿,它不仅兼具舒适与时尚,更能展现出一种随性的休闲风格。无论是搭
  • 时尚商务西服套装
    时尚商务西服套装
    2023-12-16
    时尚商务西服套装.时尚商务西服套装一直是职场男士们必备的时尚单品之一。无论是商务会议、重要场合还是日常办公,一套精致的商
  • 轻盈雪纺衬衫,打造清新淑女形象
    轻盈雪纺衬衫,打造清新淑女形象
    2023-12-31
    轻盈雪纺衬衫,打造清新淑女形象.雪纺材质的衬衫一直以来都是清新淑女形象的代表,它轻盈飘逸的质地,柔软透气的触感,让人仿佛
  • 精美儿童连衣裙,时尚设计,舒适面料,适合各种场合穿着
    精美儿童连衣裙,时尚设计,舒适面
    2023-12-26
    精美儿童连衣裙,时尚设计,舒适面料,适合各种场合穿着.儿童连衣裙作为孩子们的日常穿着之一,一直备受家长们的关注。精美儿童
  • 时尚潮流运动鞋
    时尚潮流运动鞋
    2024-01-15
    时尚潮流运动鞋.时尚潮流运动鞋一直是年轻人喜爱的时尚单品,它不仅舒适耐穿,更是一种个性的象征。随着时尚潮流不断更新,运动
  • 保暖舒适羊毛大衣
    保暖舒适羊毛大衣
    2024-01-05
    保暖舒适羊毛大衣.冬季来临,寒冷的天气让人们更加注重保暖。在这个时候,一件保暖舒适的羊毛大衣成为了许多人的首选。羊毛大衣
  • 时尚个性针织毛衣
    时尚个性针织毛衣
    2023-12-11
    时尚个性针织毛衣.时尚个性针织毛衣一直是秋冬季节的必备单品,不仅可以很好地保暖,还能展现出个性与时尚。无论是女性还是男性
  • 经典款皮鞋
    经典款皮鞋
    2023-12-06
    经典款皮鞋.经典款皮鞋一直是时尚界的永恒之选,不论是商务场合、休闲聚会还是正式场合,都能展现出绅士淑女的气质和优雅。今天
  • 精致绣花针织衫,增添浪漫风情
    精致绣花针织衫,增添浪漫风情
    2023-12-01
    精致绣花针织衫,增添浪漫风情.如今,针织衫已成为时尚界不可或缺的一部分,而精致绣花针织衫更是备受追捧。其独特的设计和精湛