目录
迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。
Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
ConcreteAggregate(具体聚合器):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
Iterator 主要定义了 hasNext() 和 next() 方法。
ConcreteIterator(具体迭代器):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。
- public interface Aggregate {
- Iterator createIterator();
- }
-
- public class ConcreteAggregate implements Aggregate {
- private Integer[] items;
-
- public ConcreteAggregate() {
- items = new Integer[10];
- for (int i = 0; i < items.length; i++) {
- items[i] = i;
- }
- }
-
- @Override
- public Iterator createIterator() {
- return new ConcreteIterator
(items); - }
- }
- public interface Iterator
- {
- Item next();
-
- boolean hasNext();
- }
-
- public class ConcreteIterator
- 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;
- }
- }
- public class Client {
- public static void main(String[] args) {
- Aggregate aggregate = new ConcreteAggregate();
- Iterator
iterator = aggregate.createIterator(); - while (iterator.hasNext()) {
- System.out.println(iterator.next());
- }
- }
- }
优点:
1. 简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
2. 将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。
3. 满足开闭原则,如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。
缺点:
1. 具体迭代器实现的算法对外不可见,因此不利于调试和维护。
2. 对于某些小型、简单的集合对象来说,使用迭代器模式可能会显得过于复杂,增加了代码的复杂性。
JDK中的迭代器
java.util.Iterator
java.util.Enumeration