当前位置: 首页 > ds >正文

迭代器模式

前言

迭代器模式又称为游标模式,源于对容器的访问,比如java中的List、Map、数组等,提供一个合理的遍历访问。用法就是在用户访问类,和容器之间插入一个迭代器,提供遍历访问。这样做可以让容器功能保持单一,不用在容器内实现遍历功能。也不用对外提供内部访问方法导致细节暴露。

迭代器模式定义

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

例子

废话再多,也不如一个例子来的干脆。
1、先写一个迭代器
抽象迭代器方法

public interface Iterator<T> {boolean hasNext();T next();
}

实现迭代器

public class IteratorImpl<T> implements Iterator<T> {private List<T> list = new ArrayList<T>();private int cursor = 0;public IteratorImpl(List<T> list) {this.list = list;}@Overridepublic boolean hasNext() {return cursor != list.size();}@Overridepublic T next() {T obj = null;if (this.hasNext()) {obj = this.list.get(cursor++);}return obj;}
}

迭代器核心其实就是给带入的list提供一个遍历的方法。
2、写一个容器
抽象容器方法

public interface Container<T> {void add(T obj);void remove(T obj);Iterator<T> iterator();
}

实现容器

public class ContainerImpl<T> implements Container<T> {private List<T> list = new ArrayList<T>();@Overridepublic void add(T obj) {list.add(obj);}@Overridepublic void remove(T obj) {list.remove(obj);}@Overridepublic Iterator<T> iterator() {return new IteratorImpl<>(list);}
}

我们使用容器的时候,只要提供一个构建迭代器的方法就可以了。迭代器自行对外提供遍历方法。
3、客户端调用

        // 创建一个容器ContainerImpl<String> containerImpl = new ContainerImpl<>();containerImpl.add("jack");containerImpl.add("mom");containerImpl.add("dad");containerImpl.add("john");// 根据容器创建一个迭代器Iterator<String> iterator = containerImpl.iterator();// 迭代器提供遍历方法,遍历while (iterator.hasNext()) {Log.d("Iterator",iterator.next());}

log输出如下:

11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: jack
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: mom
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: dad
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: john

迭代器模式小结

迭代器模式结构很简单,就是提供一个list的遍历方法。目的很明确,弱化遍历算法和容器之间的关系。其实我们平时开发之中已经很少需要自己去实现迭代器,因为现在不管是Object,C++,python等等,他们直接实现了这种结构。但是理解这种设计模式也是不错的。像Android源码中数据库中的游标Cursor也是用的这种结构。

结束语

迭代器模式比较简单,也没啥多说的,最后强调迭代器模式记忆要点:根据传入的list额外提供一个遍历方法。

http://www.xdnf.cn/news/4235.html

相关文章:

  • map和set的设计以及红黑树的设计
  • 英伟达语音识别模型论文速读:Fast Conformer
  • 学习黑客Nmap 实战
  • Java学习手册:Spring 多数据源配置与管理
  • 信息系统项目管理工程师备考计算类真题讲解十二
  • 破局者手册 Ⅰ:测试开发核心基础,解锁未来测试密钥!
  • 【NLP】27. 语言模型训练以及模型选择:从预训练到下游任务
  • RAG知识库只是表面简单!
  • Kubernetes排错(七)-节点排错
  • 除了java.nio.file.StandardCopyOption,还有哪些类可以实现文件的复制和移动?
  • C++动态库和静态库的生成和使用
  • linux crash工具详解
  • android-ndk开发(1): 搭建环境
  • 星途-(4)
  • 关于Python:9. 深入理解Python运行机制
  • DeepSeek技术发展详细时间轴与技术核心解析
  • ARM子程序调用与返回
  • vscode运行python的快捷键
  • VirtualBox调整虚拟机内存和CPU
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(八)
  • 智能体四项关键技术:MCP、A2A、ANP与函数调用的深度解析
  • 判断字符是否唯一 --- 位运算
  • 《冰雪三职业》:战士玩法攻略!
  • 精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析
  • P6822 [PA 2012 Finals] Tax 题解
  • 【项目】基于ArkTS的网吧会员应用开发(2)
  • Qt天气预报系统更新UI界面
  • ansible基础-优化
  • 代码随想录算法训练营day9:字符串part02
  • 英伟达开源英语自动语音识别模型:nvidia/parakeet-tdt-0.6b-v2