1. 基本概念
迭代器模式是一种行为设计模式,是一种使用频率非常高的设计模式,在各个语言中都有应用,其主要目的是提供一种统一的方式来访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。通过迭代器,客户端可以顺序访问聚合对象的元素,而无需了解底层数据结构。
迭代器模式应用广泛,但是大多数语言都已经内置了迭代器接口,不需要自己实现。
2. 基本结构
迭代器模式包括以下几个重要角色
- 迭代器接口
Iterator
:定义访问和遍历元素的接口, 通常会包括hasNext()
方法用于检查是否还有下一个元素,以及next()
方法用于获取下一个元素。有的还会实现获取第一个元素以及获取当前元素的方法。
- 具体迭代器
ConcreateIterator
:实现迭代器接口,实现遍历逻辑对聚合对象进行遍历。
- 抽象聚合类:定义了创建迭代器的接口,包括一个
createIterator
方法用于创建一个迭代器对象。
- 具体聚合类:实现在抽象聚合类中声明的
createIterator()
方法,返回一个与具体聚合对应的具体迭代器
3. 简易实现
- 定义迭代器接口:通常会有检查是否还有下一个元素以及获取下一个元素的方法。
1 2 3 4 5 6 7
| public interface Iterator{ boolean hasNext(); Object next(); }
|
- 定义具体迭代器:实现迭代器接口,遍历集合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class ConcreteIterator implements Iterator { private int index; private List<Object> elements;
public ConcreteIterator(List<Object> elements) { this.elements = elements; this.index = 0; }
@Override public boolean hasNext() { return index < elements.size(); }
@Override public Object next() { if (hasNext()) { return elements.get(index++); } return null; } }
|
- 定义聚合接口:通常包括
createIterator()
方法,用于创建迭代器
1 2 3
| public interface Iterable { Iterator createIterator(); }
|
- 实现具体聚合:创建具体的迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class ConcreteIterable implements Iterable { private List<Object> elements;
public ConcreteIterable(List<Object> elements) { this.elements = elements; }
@Override public Iterator createIterator() { return new ConcreteIterator(elements); } }
|
- 客户端使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import java.util.ArrayList; import java.util.List;
public class IteratorPatternExample { public static void main(String[] args) { List<Object> elements = new ArrayList<>(); elements.add("Element 1"); elements.add("Element 2"); elements.add("Element 3");
Iterable iterable = new ConcreteIterable(elements); Iterator iterator = iterable.createIterator();
while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
|
4. 使用场景
迭代器模式是一种通用的设计模式,其封装性强,简化了客户端代码,客户端不需要知道集合的内部结构,只需要关心迭代器和迭代接口就可以完成元素的访问。但是引入迭代器模式会增加额外的类,每增加一个集合类,都需要增加该集合对应的迭代器,这也会使得代码结构变得更加复杂。