迭代器模式
1.模式动机与定义
模式动机
电视机 <——> 存储电视频道的集合 <——> 聚合类(Aggregate Classes)
电视机遥控器 <——> 操作电视频道 <——>迭代器(lterator)
访问一个聚合对象中的元素但又不需要暴露它的内部结构 <——> 迭代器模式
- 在迭代器模式中,提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的元素,了解哪些元素已经遍历过而哪些没有。
- 有了迭代器模式,我们会发现对一个复杂的聚合对象的操作会变得如此简单。
模式定义
- 迭代器模式(lterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
- 其别名为游标(Cursor)
- 迭代器模式是一种对象行为型模式
2.模式结构与分析
模式结构
迭代器模式包含如下角色
- lterator: 抽象迭代器:定义了访问和遍历元素的接口。一般声明:用于获取第一个元素的first,用于访问下一个元素的next,用于判断是否还有下一个元素的hasNext,用于获取当前元素currentItem,在其子类中将实现这类方法。
- Concretelterator: 具体迭代器:实现了抽象迭代器接口,完成对聚合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。
- Aggregate:抽象聚合类:用于存储对象,并定义创建相应迭代器对象的接口。声明一个createIterator方法用于创建一个迭代器对象。
- ConcreteAggregate:具体聚合类:实现了创建相应迭代器的接口,实现了在聚合类中声明的createIterator方法,该方法返回一个与该具体聚合对应的具体迭代器ConcreteIterator 实例。
模式分析
聚合对象的两个职责
- 存储数据,聚合对象的基本职责
- 遍历数据,既是可变化的,又是可分离的
将遍历数据的行为从聚合对象中分离出来,封装在迭代器对象中
由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则
//JDK内置迭代器 java.util.Collection
package java.util;
public interface Collection<E> extends Iterable<E>{
boolean add(Object c);
boolean addAll(Collection c);
boolean remove(Object o);
boolean removeAll(Collection c);
boolean remainAll(Collection c);
Iterator iterator();
}
//java.util.lterator
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
//测试代码
public static void process(Collection c){
Iteratori=c.iterator();//创建迭代器对象
//通过迭代器遍历聚合对象
while(i.hasNext()){
System.out.println(i.next().toString());
}
}
3.模式效果与应用
优点
- 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式
- 简化了聚合类
- 由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,符合开闭原则
缺点
- 在增加新的聚合类时需要对应地增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性
- 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是一件很容易的事情
使用情况
- 访问一个聚合对象的内容而无须暴露它的内部表示
- 需要为一个聚合对象提供多种遍历方式
- 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口
模式扩展
在JDK中,Iterator接口具有如下3个基本方法:
- Object next():通过反复调用next()方法可以逐个访问聚合中的元素。
- boolean hasNext():hasNext()方法用于判断聚合对象中是否还存在下一个元素,为了不抛出异常,必须在调用next()之前先调用hasNext()。如果迭代对象仍然拥有可供访问的元素,那么hasNext()返回true。
- void remove():用于删除上次调用next()时所返回的元素。
Iterator iterator=collection.iterator()://collection是已实例化的集合对象
iterator.next(); //跳过第一个元素
iterator.remove(); //删除第一个元素
iterator.remove();
iterator.next();//该语句不能去掉
iterator.remove();
浙公网安备 33010602011771号