介绍
基本介绍
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
注意
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
作用
遍历一个聚合对象
使用场景
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 需要为聚合对象提供多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
案例
package top.lldwb.iteratorPattern;
import java.util.ArrayList;
import java.util.List;
// 抽象迭代器接口
interface Iterator {
boolean hasNext(); // 是否还有下一个元素
Object next(); // 获取下一个元素
}
// 具体迭代器类
class ConcreteIterator implements Iterator {
private List<Object> list; // 存储数据的集合
private int index = 0; // 当前迭代器的位置
ConcreteIterator(List<Object> list) {
this.list = list;
}
public boolean hasNext() {
return index < list.size();
}
public Object next() {
if (this.hasNext()) {
return list.get(index++);
}
return null;
}
}
// 抽象聚合类
interface Aggregate {
void add(Object obj); // 添加元素到集合
void remove(Object obj); // 从集合中移除元素
Iterator createIterator(); // 创建迭代器
}
// 具体聚合类
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 createIterator() {
return new ConcreteIterator(list);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("元素A");
aggregate.add("元素B");
aggregate.add("元素C");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
注释:
-
Iterator
是抽象迭代器接口,定义了两个方法:hasNext()
用于判断是否还有下一个元素,next()
用于获取下一个元素。 -
ConcreteIterator
是具体迭代器类,实现了抽象迭代器接口。它维护一个数据集合list
和一个位置索引index
,通过hasNext()
和next()
方法实现对集合的遍历。 -
Aggregate
是抽象聚合类,定义了三个方法:add()
用于添加元素到集合,remove()
用于从集合中移除元素,createIterator()
用于创建迭代器对象。 -
ConcreteAggregate
是具体聚合类,实现了抽象聚合类。它内部使用List
来存储数据,并提供了实现抽象聚合类中的三个方法。 -
客户端代码中首先创建具体聚合类
ConcreteAggregate
,并添加一些元素。然后通过createIterator()
方法获取迭代器对象,并使用迭代器遍历输出集合中的元素。
优缺点
优点
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。