行为模式3.迭代器模式
行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
迭代器模式(Iterator Pattern) 是一种行为型设计模式,它提供一种顺序访问集合对象元素的方式,而不暴露集合的内部结构。迭代器模式允许客户端按顺序访问集合中的元素,而无需直接访问集合本身。通常,当你有一个集合(如列表、队列、栈等),你希望对集合中的元素进行迭代,但又不想暴露其内部结构时,可以使用迭代器模式。
迭代器模式的主要组成部分
- Iterator(迭代器):迭代器接口,定义了遍历集合元素的方法,如
hasNext()
和next()
。 - ConcreteIterator(具体迭代器):实现了Iterator接口,并定义了如何遍历具体集合中的元素。
- Aggregate(聚合类,也叫集合类):集合接口,提供创建迭代器对象的方法。
- ConcreteAggregate(具体聚合类):实现了Aggregate接口,定义了如何存储和获取集合元素。
迭代器模式的工作流程
- 创建迭代器:客户端通过聚合类获取迭代器实例。
- 遍历集合:客户端通过迭代器的方法遍历集合中的元素,使用
hasNext()
判断是否有下一个元素,使用next()
获取当前元素。 - 不暴露集合的内部实现:迭代器模式让客户端能够通过标准的接口访问集合元素,而不需要知道集合的内部结构。
迭代器模式的优点
- 封装性:集合的实现细节对客户端是隐藏的,客户端不需要关心集合如何存储数据。
- 灵活性:可以对不同的集合类型使用相同的迭代方式。
- 单一职责:聚合类负责存储数据,迭代器类负责遍历数据,这样做可以避免集合类本身过于复杂。
Java 示例代码
import java.util.ArrayList;
import java.util.List;
// 1. 定义Iterator接口
interface Iterator {
boolean hasNext(); // 判断是否有下一个元素
Object next(); // 获取下一个元素
}
// 2. 定义Aggregate接口(集合接口)
interface Aggregate {
Iterator createIterator(); // 创建一个迭代器
}
// 3. ConcreteIterator(具体迭代器)实现Iterator接口
class ConcreteIterator implements Iterator {
private List<Object> items;
private int position = 0;
public ConcreteIterator(List<Object> items) {
this.items = items;
}
@Override
public boolean hasNext() {
return position < items.size();
}
@Override
public Object next() {
if (this.hasNext()) {
return items.get(position++);
}
return null;
}
}
// 4. ConcreteAggregate(具体集合类)实现Aggregate接口
class ConcreteAggregate implements Aggregate {
private List<Object> items = new ArrayList<>();
public void addItem(Object item) {
items.add(item);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(items);
}
}
// 5. 客户端使用迭代器遍历集合
public class IteratorPatternDemo {
public static void main(String[] args) {
// 创建一个具体的集合
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.addItem("Item 1");
aggregate.addItem("Item 2");
aggregate.addItem("Item 3");
aggregate.addItem("Item 4");
// 创建迭代器
Iterator iterator = aggregate.createIterator();
// 使用迭代器遍历集合
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}