1. 设计模式-迭代器模式
迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种访问集合对象元素的统一方式,而不需要了解集合内部的细节。迭代器模式定义了一个迭代器接口,该接口负责遍历集合对象,从而简化了对集合的遍历操作,并支持多态迭代。
迭代器模式的核心是将集合的遍历职责分离到一个独立的迭代器对象上,这样做的好处是,集合的内部结构可以自由变化,而客户端代码无需调整。迭代器模式遵循单一职责原则,使得集合类只负责存储数据,而遍历逻辑由迭代器类负责。
下面是一个简单的迭代器模式示例,包括一个容器接口(Iterable)、一个具体的容器类(ArrayList)以及迭代器接口(Iterator)和其实现。
2. 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
3. 容器接口
interface Iterable<T> {
Iterator<T> iterator();
}
4. 具体的容器类
class ArrayList<T> implements Iterable<T> {
private Object[] elements = new Object[10];
private int size = 0;
public void add(T element) {
if (size == elements.length) {
Object[] temp = new Object[elements.length * 2];
System.arraycopy(elements, 0, temp, 0, elements.length);
elements = temp;
}
elements[size++] = element;
}
@Override
public Iterator<T> iterator() {
return new ArrayIterator<>(this);
}
private T getElement(int index) {
return (T) elements[index];
}
private class ArrayIterator<E> implements Iterator<E> {
private ArrayList<E> list;
private int cursor;
public ArrayIterator(ArrayList<E> list) {
this.list = list;
this.cursor = 0;
}
@Override
public boolean hasNext() {
return cursor != list.size;
}
@Override
public E next() {
if (!hasNext()) throw new NoSuchElementException();
return list.getElement(cursor++);
}
}
}
5. 使用示例
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
Iterator<String> it = names.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
迭代器模式是一种实用的设计模式,特别是在处理集合和需要提供统一遍历接口的场景下。它通过解耦集合的遍历逻辑与集合本身,提升了代码的灵活性和重用性。然而,针对性能敏感的应用,需要权衡迭代器模式带来的便利性和潜在的性能损失。在实际应用中,Java 的 java.util.Iterator
和 Iterable
接口已经为我们实现了标准的迭代器模式,大多数情况下可以直接使用。
6. 优点
- 封装性:迭代器模式将集合的遍历操作与集合本身分离,提高了集合的封装性。
- 迭代多样化:不同的集合类型可以提供不同的迭代器实现,支持多种遍历方式。
- 简化集合接口:使用者无需知道集合的内部结构,只需通过迭代器接口就能遍历集合。
7. 缺点
- 额外的开发工作:需要为每个集合类创建相应的迭代器类,增加了开发成本。
- 迭代器模式的遍历效率:相比直接遍历数组或链表,迭代器模式会引入一定的性能开销。