设计模式【Iterator 模式】

Iterator 模式

1.什么是 Iterator 模式

Iterator 模式就是按照顺序遍历数据集合。

2.示例程序

1.Aggregate 接口

Aggregate 接口是要遍历的集合的接口,声明方法 iterator ,实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。

public interface Aggregate {
    // 返回值是Iterator,体现和集合类的实现无关性,只返回迭代器类迭代到的数据
    public abstract Iterator iterator();
}

2.Iterator 接口

Iterator 接口用于遍历集合中的元素。
这里先提供两个方法 hasNext 和 next 。

public interface Iterator {
    public abstract boolean hasNext();
    // 这里的next方法是要有返回值的
    public abstract Object next();
}

3.BookShelf 类(实现 Aggregate)

BookShelf 是一个集合,实现了 Aggregate 接口。可以被 BookShelfIterator 遍历。

public class BookShelf implements Aggregate{
    // 本类是Book类的集合,使用ArrayList存储Book对象,便于书架中进行添加书等操作
    private ArrayList<Book> books;

    // 构造方法,初始化集合对象
    public BookShelf() {
        this.books = new ArrayList<Book>();
    }
    
    // iterator方法,用来遍历本集合
    public Iterator iterator() {
        // BookShelfIterator会返回迭代的结果
        return new BookShelfIterator(this);
    }
    
    // 添加书本
    public void addBook(Book book) {
        books.add(book);
    }
    // 根据索引查找书本
    public Book getBook(int index) {
        return books.get(index);
    }
    // 返回书本数量
    public int getLength() {
        return books.size();
    }
}

4.Book 类(BookShelf 的属性)

表示书的类,是 BookShelf 类这个集合的元素。

public class Book {
    private String name;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

5.BookShelfIterator 类(实现 Iterator)

用于遍历 BookShelf 的迭代器,实现了 Iterator ,作用是将 BookShelf 的实现和遍历分离。

public class BookShelfIterator implements Iterator{
    // 本类对BookShelf进行遍历,添加BookShelf对象
    private BookShelf bookShelf;
    // 要根据索引对bookShelf进行操作
    private int index;
    
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    
    // 可以理解为是否还能遍历,即调用next()
    public boolean hasNext() {
        // 索引等于长度的时候就超出去了
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBook(index);
        index++;
        return book;
    }
}

6.Main

程序测试类。

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf();
        bookShelf.addBook(new Book("地球往事"));
        bookShelf.addBook(new Book("黑暗森林"));
        bookShelf.addBook(new Book("死神永生"));
        bookShelf.addBook(new Book("流浪地球"));
        // 创建迭代器
        Iterator it = new BookShelfIterator(bookShelf);
        // 迭代
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}


//程序执行结果:
/*地球往事
黑暗森林
死神永生
流浪地球*/

3.思考

1.类图

Iterator模式类图

2.Iterator

1.Iterator 的实现类可以有多个,可以设计多种遍历方式,至于使用哪种方式,就要看集合实现类中调用 iterator 方法时 new 的是哪一个迭代器。
*2.Iterator 可以将集合实现类的实现和遍历分离开来,当使用诸如 while 循环来遍历集合时,不需要依赖集合的实现,只需要使用迭代器类的方法如 hasNext() 和 next(),这也是为什么要使用 Iterator 模式。

3.集合类和迭代器类的关系

集合的实现类和迭代器的实现类是有对应关系的,一但集合类的某些API发生变化,是需要修改迭代器类的。

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ♥
设计模式专栏:不易|设计模式 ♥

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

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

相关文章

ab压力测试

标题相关概念 QPS&#xff0c;每秒查询 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中&#xff0c;作为域名系统服务器的机…

论文阅读——DistilBERT

ArXiv&#xff1a;https://arxiv.org/abs/1910.01108 Train Loss: DistilBERT&#xff1a; DistilBERT具有与BERT相同的一般结构&#xff0c;层数减少2倍&#xff0c;移除token类型嵌入和pooler。从老师那里取一层来初始化学生。 The token-type embeddings and the pooler a…

Spring Cloud Sentinel整合Nacos实现配置持久化

sentinel配置相关配置后无法持久化&#xff0c;服务重启之后就没了&#xff0c;所以整合nacos&#xff0c;在nacos服务持久化&#xff0c;sentinel实时与nacos通信获取相关配置。 使用上一章节Feign消费者服务实现整合。 版本信息&#xff1a; nacos:1.4.1 Sentinel 控制台 …

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代&#xff0c;小程序已经成为企业营销的重要工具。通过小程序&#xff0c;企业可以提供更加便捷、高效的服务&#xff0c;吸引更多的用户和客户。本文将以小程序营销活动为主题&#xff0c;介绍如何在小程序文章中加入营销活动&#xff0c;提高品牌知名度和销售额。…

摆玩具[算法赛](差分)

本题链接&#xff1a;用户登录 题目&#xff1a; 样例&#xff1a; 输入 5 2 2 5 7 10 13 输出 8 思路&#xff1a; 由题意&#xff0c;这是一个递增的数组&#xff0c;其次要求最小的极差&#xff0c;对 数组 进行分成 k 个分段数组。 由于是一个递增的数组&#xf…

mysql查看数据表文件的存放路径

mysql查看数据表文件的存放路径_怎么看mysql表的位置在哪-CSDN博客 问题&#xff1a; 我们在mysql的安装目录中没有找到data&#xff08;数据库存放的地方&#xff09;的文件夹&#xff0c;我们需要找到数据库文件data的存放目录。 解决方法&#xff1a;在mysql的cmd中输入以下…

C++之左值、右值、std::forward、std::move总结(二百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

spring boot利用redis作为缓存

一、缓存介绍 在 Spring Boot 中&#xff0c;可以使用 Spring Cache abstraction 来实现缓存功能。Spring Cache abstraction 是 Spring 框架提供的一个抽象层&#xff0c;它对底层缓存实现&#xff08;如 Redis、Ehcache、Caffeine 等&#xff09;进行了封装&#xff0c;使得在…

C++入门精讲——入门看完这一篇就够了

文章目录 前言1. C发展历史2. 关键字3. 命名空间3.1 命名空间的概念3.2 命名空间的定义3.3 命名空间的使用 4. C输入、输出5. 缺省参数5.1 全缺省5.2 半缺省 6. 函数重载6.1 几种不同类型的函数重载6.2 函数重载的原理——名字修饰(name Mangling)6.2.1 C程序为什么不支持函数重…

Nokogiri库和OpenURI库使用HTTP做一个爬虫

Nokogiri和OpenURI是两个常用的Ruby库&#xff0c;用于编写爬虫程序。它们的主要功能如下&#xff1a; 1、Nokogiri&#xff1a;Nokogiri是一个强大的HTML和XML解析库&#xff0c;可以用于解析网页内容。它提供了一组简单易用的API&#xff0c;可以方便地遍历和操作HTML或XML文…

模型对象CSS2DObject始终在画布的左上角(问题解决)

写了个简单案例模拟一下这个问题&#xff0c;看下图片 下面看下c2渲染器相关代码部分 this.css2DRenderer new CSS2DRenderer(); this.css2DRenderer.render(this.scene, this.camera); this.css2DRenderer.setSize(width, height); this.css2DRenderer.domElement.style.pos…

【每日一题】合并两个有序数组

链接奉上&#xff1a;合并两个有序数组 目录 直接合并后排序&#xff1a;思路&#xff1a;代码实现&#xff1a; 双指针思路&#xff1a;代码实现&#xff1a; 直接合并后排序&#xff1a; 思路&#xff1a; 将nums2直接合并到nums1后边&#xff0c;并进行排序 代码实现&…

Proteus仿真--基于51单片机的LED模拟交通灯仿真(仿真文件+程序)

本文主要介绍基于51单片机的LED模拟交通灯仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真运行视频 Proteus仿真--基于51单片机的LED模拟交通灯仿真&#xff08;仿真文件程序&#xff09; 附完整Proteus仿真资料代码资料 百度网盘链接: https://pan.baidu.c…

STM32F4X SDIO(二) SDIO协议

上一节简单介绍了SD卡的分类&#xff0c;本节将会介绍SD卡的通信协议&#xff0c;也就是SDIO协议。 STM32F4X SDIO&#xff08;二&#xff09;SDIO协议 SD 卡管脚和寄存器SD卡管脚分布SD卡通信协议SD卡寄存器SD卡内部结构 SDIO总线SDIO总线拓扑SDIO总线协议SDIO协议的基本结构…

Oracle (7)Online Redo Log Files

目录 一、Oracle Online Redo Log Files及其相关内容介绍 1、Online Redo Log Files简介 2、Online Redo Log Files特点 3、Online Redo Log Files文件组 4、多路复用文件 5、联机重做日志文件工作方式 6、LGWR什么时候写重做 7、LS和LSN 8、删除Redo文件成员 9、删除…

CTF-php特性绕过

注意&#xff1a;null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…

C语言每日一题(21)删除排序数组中的重复项

力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…

Redis(02)| 数据结构-SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

哪一个更好?Spring boot还是Node.js

前言 本篇文章有些与众不同&#xff0c;由于我自己手头有些关于这个主题的个人经验&#xff0c;受其启发写出此文。虽然SpringBoot和Node.js服务于很不一样的场景&#xff0c;但是这两个框架共性惊人。其实每种语言都有不计其数的框架&#xff0c;但仅仅一部分是真正卓越的。如…

【优选算法系列】第二节.双指针(202. 快乐数和11. 盛最多水的容器)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…
最新文章