一、迭代器模式定义
迭代器模式提供了一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。(Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.)
迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型、Set类型等,迭代器模式就是为解决遍历这些容器中的元素而诞生的。
迭代器模式的通用类图如下
针对上面类图,下面有个大体的实现源码
迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
聚合对象接口
interface Aggregate {
Iterator createIterator();
}
具体迭代器
class ConcreteIterator implements Iterator {
private List<Object> elements;
private int position;
public ConcreteIterator(List<Object> elements) {
this.elements = elements;
this.position = 0;
}
public boolean hasNext() {
return position < elements.size();
}
public Object next() {
Object element = elements.get(position);
position++;
return element;
}
}
具体聚合对象
class ConcreteAggregate implements Aggregate {
private List<Object> elements;
public ConcreteAggregate() {
this.elements = new ArrayList<>();
}
public void addElement(Object element) {
elements.add(element);
}
public Iterator createIterator() {
return new ConcreteIterator(elements);
}
}
客户端代码
public class Main {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.addElement("Element 1");
aggregate.addElement("Element 2");
aggregate.addElement("Element 3");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
Object element = iterator.next();
System.out.println(element);
}
}
}
输出
Element 1
Element 2
Element 3
二、JDK中的迭代器
我们知道JDK自带迭代器,比如我们常用的ArrayList或者HashSet,直接调用iterator方法就可以获取到Iterator对象,从而实现对整个集合的迭代,其类图如下所示
你还真别说,不看不知道,一看吓一跳,这集合框架里面的类看类图真的有设计的美感,啧啧。。。
无论是List还是HashSet,它们的顶层接口都是Iterable接口,这表示它们是可迭代的,调用iterator方法就可以获取迭代对象。
具体的实现方法,在ArrayList中和HashSet类中实现,总的来说,都是针对各自不同的数据结构,实现相同的Iterator接口。
这样就完成了集合类迭代器API的统一。
三、最佳实践
迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发。
做Java开发,尽量不要自己写迭代器模式!省省吧,使用Java提供的Iterator一般就能满足你的要求了。
参考文档:https://refactoringguru.cn/design-patterns/iterator
《设计模式之禅》第20章 《迭代器模式》
END.
注意:本文归作者所有,未经作者允许,不得转载