迭代器模式(Iterator Pattern),提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
**
迭代器模式是通过将聚合对象的遍历行为分离出来,抽象成迭代器类来实现的,其目的是在不暴露聚合对象的内部结构的情况下,让外部代码透明地访问聚合的内部数据。
迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例,要遍历ArrayList,即使我们知道它的内部存储了一个Object[]数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构。如果使用Iterator遍历,那么,ArrayList和LinkedList都可以以一种统一的接口来遍历:
List<String> list = ...for (Iterator<String> it = list.iterator(); it.hasNext(); ) {String s = it.next();}
迭代器模式的组成如下:
| Aggregate(抽象聚合角色) | 定义存储、添加、删除聚合对象以及创建迭代器对象的接口 |
|---|---|
| Concrete Aggregate(具体聚合角色) | 实现抽象聚合类,返回一个具体迭代器的实例 |
| Iterator(迭代器角色) | 定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法 |
| Concrete Iterator(具体迭代器角色) | 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置 |
迭代器模式的优点
- 访问一个聚合对象的内容而无须暴露它的内部表示
- 遍历任务交由迭代器完成,这简化了聚合类
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口
迭代器模式的缺点
- 增加了类的个数,这在一定程度上增加了系统的复杂性
迭代器模式应用场景
- 当需要为聚合对象提供多种遍历方式时
- 当需要为遍历不同的聚合结构提供一个统一的接口时
- 当访问一个聚合对象的内容而无须暴露其内部细节的表示时
迭代器模式使用示例
public class IteratorPattern {//抽象迭代器:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法interface Iterator {Object first();Object next();boolean hasNext();}// 抽象聚合:定义存储、添加、删除聚合对象以及创建迭代器对象的接口private interface Aggregate {void add(Object obj);void remove(Object obj);Iterator getIterator();}//具体聚合:实现抽象聚合类,返回一个具体迭代器的实例static class ConcreteAggregate implements Aggregate {private List<Object> list = new ArrayList<>();public void add(Object obj) {list.add(obj);}public void remove(Object obj) {list.remove(obj);}public Iterator getIterator() {return (new ConcreteIterator(list));}}//具体迭代器static class ConcreteIterator implements Iterator {private List<Object> list = null;private int index = -1;public ConcreteIterator(List<Object> list) {this.list = list;}public boolean hasNext() {if (index < list.size() - 1) {return true;} else {return false;}}public Object first() {index = 0;return list.get(index);}public Object next() {Object obj = null;if (this.hasNext()) {obj = list.get(++index);}return obj;}}public static void main(String[] args) {Aggregate ag = new ConcreteAggregate();ag.add("中山大学");ag.add("华南理工");ag.add("韶关学院");System.out.println("聚合的内容有:");Iterator it = ag.getIterator();while (it.hasNext()) {Object ob = it.next();System.out.println("\t" + ob.toString());}Object ob = it.first();System.out.println("\nFirst:" + ob.toString());}}
程序运行结果如下:
:::success
聚合的内容有:
中山大学
华南理工
韶关学院
First:中山大学 :::
