[设计模式] 迭代器模式
意图
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.
什么是聚合对象? 数组、堆栈、列表、散列表等.
关键思想是将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器(iterator)对象中.
创建迭代器是一个Factory Method模式的例子
别名
游标(Cursor)
适用性
迭代器模式可用来:
- 访问一个聚合对象的内容而无需暴露它的内部表示
- 支持对聚合对象的多种遍历
- 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)
结构
参与者
- Iterator(迭代器)
- 迭代器定义访问和遍历元素的接口
- ConcreteIterator(具体迭代器)
- 具体迭代器实现迭代器接口
- 对该聚合遍历时跟踪当前位置
- Aggregate(聚合)
- 聚合定义创建相应迭代器对象的接口【使用了工厂方法模式, CreateIterator()为工厂方法】
- ConcreteAggregate(具体聚合)
- 具体聚合实现创建相应迭代器的接口, 该操作返回ConcreteIterator的一个适当的实例
协作
- ConcreteIterator跟踪聚合中的当前对象, 并能够计算出待遍历的后继对象.
效果
迭代器模式有三个重要的作用:
- 它支持以不同的方式遍历一个聚合【前序 中序 后序】
- 迭代器简化了聚合的接口
- 在同一个聚合上可以有多个遍历
实现
相关模式
- Composite: 迭代器常被应用到像复合这样的递归结构上
- Factory Method: 多态迭代器靠Factory Method来实例化适当的迭代器子类
- Memento: 常与迭代器模式一起使用. 迭代器可使用一个memento来捕获一个迭代的 状态. 迭代器在其内部存储memento
JDK
recognizeable by behavioral methods sequentially returning instances of a different type from a queue
- All implementations of java.util.Iterator (thus among others also java.util.Scanner!).
- All implementations of java.util.Enumeration
- java.util.Collection
接口扩展了Iterator接口.