迭代器模式
定义
提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。
类图
Iterator(迭代器)
负责定义按顺序逐个遍历元素的接口(API)。它定义了hasNext和next两个方法。其中,hasNext用于判断是否存在下一个元素,next方法则用于获取该元素。
ConcreteIterator(具体迭代器)
它负责实现Iterator所定义的接口。
Aggregate(集合)
它负责定义创建Iterator角色的接口。这个接口是一个方法,会创建出“按顺序访问保存在我内部元素的人”。
ConcreteAggregate(具体的集合)
负责实现Aggregate所定义的接口。它会创建出具体的Iterator角色,即ConcreteIterator角色。
示例
示例类图
类和接口的一览表
名字 | 说明 |
---|---|
Aggregate | 表示集合的接口 |
Iterator | 遍历集合的接口 |
Book | 表示书的类 |
BookShelf | 表示书架的类 |
BookShelfIterator | 遍历书架的类 |
Main | 测试类 |
Aggregate接口
1 | public interface Aggregate { |
Iterator接口
1 | public interface Iterator { |
Book类
1 | public class Book { |
BookShelf类
1 | public class BookShelf implements Aggregate{ |
BookShelfIterator类
1 | public class BookShelfIterator implements Iterator{ |
Main类
1 | public class Main { |
总结
为什么一定要考虑引入Iterator这种复杂的设计模式呢?如果是数组,直接使用for循环语句进行遍历处理不就可以了么?为什么要在集合之外引入Iterator这个角色呢?
一个重要的理由是,引入Iterator后可以将遍历与实现分离开来。请看下面的代码:
1 | while(bIterator.hasNext()) { |
这里只使用了Itreator的hasNext和next方法,并没有调用BookShelf的方法。也就是说,这里的while循环并不依赖于BookShelf的实现。