迭代器模式

1991/6/26 行为型

# 概述

Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。

提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示。

把在元素之间游走的责任交给迭代器,而不是聚合对象。**主要解决:**不同的方式来遍历整个整合对象。

# 示例

以使用迭代器打印名字为例,总共分三步:

  1. 创建接口:

    public interface Iterator {
    
        public boolean hasNext();
    
        public Object next();
    }
    public interface Container {
        public Iterator getIterator();
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  2. 创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator。

    public class NameRepository implements Container {
     
         private String names[] = {"John", "jingbin", "youlookwhat", "lookthis"};
     
         @Override
         public Iterator getIterator() {
             return new NameIterator();
         }
     
         private class NameIterator implements Iterator {
     
             int index;
     
             @Override
             public boolean hasNext() {
                 if (index < names.length) {
                     return true;
                 }
                 return false;
             }
     
             @Override
             public Object next() {
                 if (hasNext()) {
                     return names[index++];
                 }
                 return null;
             }
         }
     }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
  3. 使用 NameRepository 来获取迭代器,并打印名字。

    NameRepository nameRepository = new NameRepository();
     for (Iterator iterator = nameRepository.getIterator(); iterator.hasNext(); ) {
         String name = (String) iterator.next();
         Log.e("---", name);
         /*
          * /---: John
          * /---: jingbin
          * /---: youlookwhat
          * /---: lookthis
          */
     }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

# JDK应用实例

**应用实例:**JAVA 中的 iterator。

优点:

  • 它支持以不同的方式遍历一个聚合对象。

  • 迭代器简化了聚合类。

  • 在同一个聚合上可以有多个遍历。

  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点:

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

使用场景:

  • 访问一个聚合对象的内容而无须暴露它的内部表示。

  • 需要为聚合对象提供多种遍历方式。

  • 为遍历不同的聚合结构提供一个统一的接口。

迭代器模式在JDK中的应用

Iterator<Integer> iter = null;

System.out.println("ArrayList:");
iter = arrayList.iterator();
while (iter.hasNext()) {
    System.out.print(iter.next() + "\t");
}
1
2
3
4
5
6
7