首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

设计模式之迭代器模式

编程知识
2024年08月31日 15:55

迭代器模式很多人都熟悉,但是什么是迭代器,为什么要用迭代器?
这个很多人就很难做出具体回答了,只是知道如果有了迭代器,那么我们就能foreach遍历了,方便循环处理。
这只是对迭代器的用途,进行了回答,foreach语法是java1.5时加入的语法糖,那么在这之前呢,之前是怎么做的?
要知道并不是所有容器都支持以索引位置的形式,来获取某个具体位置的元素,那么对于这种无序的容器当时怎么遍历呢?
这就要说到迭代器模式了
迭代器模式就是你不需要了解容器内部数据存储的细节,就可以依次的,按照某种顺序获取完容器里边的元素。

迭代器模式(Iterator Pattern)是面向对象的23种设计模式中的一种,属于行为模式的范围。
而在java中,已经开好默认的接口,你只需要按照接口的约定来实现对应的方法即可:
类图如下:

 

我们按照要求写一份实现代码,与以往容器不同的是,数据虽然只存了一份,但是我们要求遍历的时候,每份数据我都能遍历若干份:

容器类、迭代器类

 1 package com.example.demo.learn.pattern.behavior.iter;
 2 
 3 import java.util.Iterator;
 4 
 5 /**
 6  * @discription
 7  */
 8 public class FixCollection<T> implements Iterable<T> {
 9     Object[] data;
10 
11     int max;
12 
13     int cur = 0;
14 
15     int loop = 0;
16 
17     public FixCollection(int max, int loop) {
18         this.max = max;
19         data = new Object[max];
20         this.loop = loop;
21     }
22 
23     public boolean addData(T t) {
24         if (cur < max) {
25             data[cur++] = t;
26             return true;
27         }
28         return false;
29     }
30 
31 
32     @Override
33     public Iterator<T> iterator() {
34         return new LoopIterator();
35     }
36 
37     class LoopIterator implements Iterator<T> {
38         // 索引位置:
39         int index = 0;
40 
41 
42         public LoopIterator() {
43         }
44 
45         public boolean hasNext() {
46             return cur * loop >= (index + 1);
47         }
48 
49         public T next() {
50             int i = index++ % cur;
51             return (T) data[i];
52         }
53     }
54 }

主类

 1 package com.example.demo.learn.pattern.behavior.iter;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 import java.util.Iterator;
 6 
 7 /**
 8  * @discription
 9  */
10 
11 @Slf4j
12 public class IterMain {
13     public static void main(String[] args) {
14         FixCollection<String> collection = new FixCollection(4, 3);
15         collection.addData("1a");
16         collection.addData("2a");
17         collection.addData("3a");
18         collection.addData("4a");
19         collection.addData("5a");
20         Iterator<String> iter = collection.iterator();
21         int i = 0;
22         while (iter.hasNext()) {
23             log.warn("iter element is {}:{}", i++, iter.next());
24         }
25 
26         int j = 0;
27         for (String item : collection) {
28             log.warn("for element is {}:{}", j++, item);
29         }
30     }
31 }

 调用结果如下:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )

16:51:57.870 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 0:1a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 1:2a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 2:3a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 3:4a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 4:1a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 5:2a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 6:3a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 7:4a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 8:1a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 9:2a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 10:3a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - iter element is 11:4a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 0:1a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 1:2a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 2:3a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 3:4a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 4:1a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 5:2a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 6:3a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 7:4a
16:51:57.873 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 8:1a
16:51:57.874 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 9:2a
16:51:57.874 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 10:3a
16:51:57.874 [main] WARN com.example.demo.learn.pattern.behavior.iter.IterMain - for element is 11:4a

主要的步骤是这样的:

1、我们自定义的容器,实现Iterable接口,表示自定义容器支持返回一个迭代器。
2、我们返回的迭代器,实现Iterator 接口,支持迭代器的基本方法(还有没有下一个元素 hasNext(),以及返回下一个元素next())。

这样我们就可以使用迭代器了,也可以像示例那样使用foreach语法糖 来遍历,由编译器帮我完成相对晦涩的转写。
这时候有人就问了,这个迭代器模式有点太死板了,我的容器类直接支持依次的返回对象,还算迭代器模式么?(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
答案是算,只要你的容器不暴露具体数据,并且支持依次的返回数据元素,就算是迭代器模式。只是你现在将容器和迭代器的功能合为一体了,容器还要维护外界的访问状态,相对来说不如官方约定的那么优雅。
不要把设计模式想的过于复杂、刻板,其实我们在按照面向对象原则处理问题时,就已经在有意无意的使用各种设计模式了。

From:https://www.cnblogs.com/jilodream/p/18390478
本文地址: http://www.shuzixingkong.net/article/1614
0评论
提交 加载更多评论
其他文章 使用广播星历计算卫星坐标(Python)
前言 本代码为GNSS课程设计代码,仅供参考,使用的计算方法与公式均来源于王坚主编的《卫星定位原理与应用(第二版)》。 本代码计算结果可以通过下载精密星历进行比照,误差在1-10m左右。 实现功能:读取卫星广播星历,并将其计算为WGS-84坐标系下的坐标,每颗卫星,每15分钟输出一次。 广播星历下载
使用 Quickwit 的搜索流功能为 ClickHouse 添加全文搜索
本指南将帮助您使用 Quickwit 的搜索流功能为知名的 OLAP 数据库 ClickHouse 添加全文搜索。Quickwit 暴露了一个 REST 端点,可以极快地(每秒最多 5000 万条)流式传输匹配搜索查询的 ID 或其他属性,ClickHouse 可以轻松地使用它们进行连接查询。 我们
使用 Quickwit 的搜索流功能为 ClickHouse 添加全文搜索
探索一下 Enum 优化
探索一下 Enum 优化 SV.Enums主要是探索如何让 enum 更高效 其中涉及的优化手段并非完全自创 很多内容参考于以下项目 NetEscapades.EnumGenerators FastEnum runtime 主要优化手段 其实主要全是 空间换时间,大量缓存 封装入口方法以及 sour
使用 nuxi build-module 命令构建 Nuxt 模块
title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt: nuxi build-module 命令是构建 Nuxt 模块的核心工具,它将你的模块打包成适合
使用 nuxi build-module 命令构建 Nuxt 模块 使用 nuxi build-module 命令构建 Nuxt 模块
2024 NepCTF
NepCTF NepMagic —— CheckIn 直接玩游戏就能出 注意有一关要把隐藏的方块全找到 NepCamera 先使用tshark读取数据 结果文件中发现大量jpeg头ffd8ffe0。 猜测是多个图片,编写脚本,提取出来。 脚本: import re inputFilePath=&qu
2024 NepCTF 2024 NepCTF 2024 NepCTF
Go plan9 汇编: 打通应用到底层的任督二脉
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 作为一个严肃的 Gopher,了解汇编是必须的。本汇编系列文章会围绕基本的 Go 程序介绍汇编的基础知识。 1. Go 程序到汇编 首先看一个简单到令人发指的示例: package main func main() { a := 1 print
Go plan9 汇编: 打通应用到底层的任督二脉 Go plan9 汇编: 打通应用到底层的任督二脉
[postgres]使用pgbench进行基准测试
前言 pgbench是一种在postgres上进行基准测试的简单程序,一般安装后就会自带。pgbench可以再并发的数据库绘画中一遍遍地进行相同序列的SQL语句,并且计算平均事务率。 测试准备 既然要测postgres,肯定要先有个postgres。安装过程略过。 一些环境信息: postgres版
SNAT 与 DNAT
本文为博主原创,转载请注明出处: SNAT(Source Network Address Translation,源网络地址转换)和DNAT(Destination Network Address Translation,目标网络地址转换)是网络地址转换(NAT)中的两种重要技术,它们在实现内部网络