结构型 - 迭代器模式

目录
设计思想
迭代器模式(Iterator)是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。该模式通过定义一个迭代器接口,负责定义访问和遍历元素的方法,以及一个可迭代接口,负责返回迭代器的实例。
迭代器模式的关键思想是提供一种方法,使得客户端能够访问一个聚合对象的元素,而无需了解该对象的内部结构。
以下是迭代器模式的一些关键组成部分:
- 迭代器接口(Iterator):定义访问和遍历元素的方法,通常包括 hasNext() 判断是否有下一个元素,和 next() 返回下一个元素的方法。
- 可迭代接口(Iterable):定义一个方法 iterator(),用于返回一个迭代器的实例。这使得客户端可以通过迭代器遍历集合元素。
- 具体迭代器类(Concrete Iterator):实现迭代器接口,负责追踪遍历集合的状态和返回元素。
- 具体可迭代类(Concrete Iterable):实现可迭代接口,负责返回一个具体的迭代器实例。
- 客户端代码:使用迭代器来遍历集合元素,而不必关心集合对象的内部结构。
类图
代码实现
interface Iterator<Item> {
Item getNext();
boolean hasNext();
}
interface IterableCollection<Item> {
Iterator<Item> createIterator();
}
class ConcreteIterator<Item> implements Iterator {
private Item[] items;
private int position = 0;
public ConcreteIterator(Item[] items) {
this.items = items;
}
@Override
public Object next() {
return items[position++];
}
@Override
public boolean hasNext() {
return position < items.length;
}
}
class ConcreteCollection<Item> implements IterableCollection {
private Item[] items;
public ConcreteCollection(Item[] items) {
this.items = items;
}
@Override
public Iterator<Item> createIterator() {
return new ConcreteIterator(this.items);
}
}
public class Client {
public static void main(String[] args) {
String[] items = new String[] {"A", "B", "C"};
IterableCollection<String> iterableCollection = new IterableCollection<>(items);
Iterator<String> iterator = iterableCollection.createIterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("element ==> " + element);
}
}
}
优缺点
优点:
- 符合单一职责原则,通过将体积庞大的遍历算法代码抽取为独立的类,你可对客户端代码和集合进行整理。
- 符合开闭原则,你可实现新型的集合和迭代器并将其传递给现有代码,无需修改现有代码。
- 迭代器模式定义了统一的迭代器接口,使得客户端可以以一致的方式访问不同类型的集合对象,提高了代码的通用性。
- 迭代器模式允许为同一集合对象提供多个不同的迭代器,每个迭代器可以实现不同的遍历算法,使得客户端可以选择适合自己需求的遍历方式。
- 迭代器模式降低了集合对象和迭代器之间的耦合性,使得可以独立地改变集合对象的实现方式或增加新的迭代器,而不影响客户端代码。
缺点:
- 引入迭代器模式会增加一些额外的类和接口,可能会使得代码结构变得更加复杂,特别是对于简单的集合对象而言。
- 对于某些特殊集合,使用迭代器可能比直接遍历的效率低。
适用场景
- 迭代器模式适用于需要遍历集合元素的场景,提供了一种统一的访问方式。
- 当希望在不暴露集合内部结构的情况下遍历集合元素时,迭代器模式是一个合适的选择。
- 当需要对集合中的元素进行一致性操作,而不关心具体实现时,迭代器模式可以提供一种简洁的解决方案。