十一个行为模式之迭代器模式(Iterator Pattern)
定义:
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。使得存储和遍历两个职责相互分离,提高系统的可扩展性。
结构图:
- Iterator:抽象迭代器类,定义了访问和遍历元素的接口,例如:next(),hasNext()等方法。所有具体的迭代器将实现这些方法来完成对聚合对象的访问。
- ConcreteIterator:具体迭代器类,通常包含一个游标和一个对具体聚合类的引用。游标一般是一个非负整数,来记录访问的当前元素位置。
- Aggregate:聚合抽象类,除了定义了该聚合类的一些业务上的接口,也定义了一个createIterator()方法来创建迭代器,充当工厂方法的角色。
- ConcreteAggregate:具体聚合类,实现了Aggreate的具体方法,并且返回一个对应自己的迭代器。
注意:
- 具体聚合类和具体迭代器之间有着相互依赖关系,一般在具体迭代器中要维持一个具体聚合对象的引用。除了使用关联关系外还可以使用内部类的方法。在JDK中迭代器的实现就采用的内部类的方法,代码片段如下:
package java.util;
……
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
......
private class Itr implements Iterator<E> {
int cursor = 0;
......
}
……
}
优点:
- 支持以不同方式遍历一个聚合对象,而不同方式采取不同的迭代器实现不同的迭代算法即可,不需要改变聚合类。
- 简化了聚合类的设计,将对象的存储和遍历两个功能进行隔离,方便扩展,满足开闭原则。
实例: