迭代器模式(Iterator Pattern) 又称游标(Cursor) 模式,是行为型设计模式之一。

迭代器模式源于对容器的访问,如 Java 中的 List, Map, 数组等,我们对容器内对象的访问必然涉及遍历算法。如果将遍历算法封装在容器中,那么对于容器类来说就承担了过多的功能;而如果不提供遍历方法让使用者自己去实现,又会让容器的内部细节暴露无遗。此时,迭代器模式应运而生,在客户访问类与容器体之间插入一个第三者——迭代器,很好的解决了上述的弊端。

定义

提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。

使用场景

  • 遍历一个容器对象
  • 对外提供一个可遍历的列表

UML

image.png

  • Iterator: 迭代器接口,负责定义、访问遍历元素的接口
  • ConcreteIterator: 具体的迭代器类
  • Aggregate: 容器类接口
  • ConcreteAggregate: 具体容器类

几乎所有的高级语言的容器类都为我们提供了相应的迭代器,而开发者也几乎不会自己去实现一个迭代器。

Android 源码中的实现

Android 源码中,也有了各种数据结构体,如 List, Map 所包含的迭代器外,还有提供迭代器来遍历访问各种数据,最典型的例子就是数据库查询使用的 Cursor。当我们使用 SQLiteDatabase 的 query 方法查询数据库时,会返回一个 Cursor 游标对象,这个 Cursor 的实现就是一个典型的迭代器。

  1. package android.database;
  2. public interface Cursor extends Closeable {
  3. // 将游标移到当前遍历数据的下一行位置
  4. boolean moveToNext();
  5. // 以及其它一系列 getXXX 方法,用于取出当前行的数据
  6. int getInt(int columnIndex);
  7. //... 省略其它方法
  8. }

小结

优点

  • 支持以不同的方式去遍历一个容器对象
  • 对外界隐藏容器对象的实现细节

缺点

类增加了,麻烦

链接:迭代器模式