设计模式(16/23) - 迭代器模式

26 阅读3分钟

迭代器模式

1 概述

  • 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式通过将集合对象的迭代逻辑封装到迭代器对象中,使得客户端可以使用一致的方法遍历不同的集合对象。
  • 这种模式通过引入迭代器接口和具体迭代器类,将集合对象的遍历操作与集合对象本身分离,从而实现遍历算法的多样性和集合对象的独立性。

2 优缺点及应用场景

2.1 优点

  • 1)简化客户端代码:客户端可以使用统一的接口遍历不同的集合对象,无需了解集合的内部实现。
  • 2)支持多种遍历方式:可以根据需要实现不同的迭代器,以支持多种遍历方式。
  • 3)符合单一职责原则:迭代器模式将集合对象的遍历行为从集合类中分离出来,使得集合类和迭代器类各自负责不同的职责。

2.2 缺点

  • 1)增加了类的数量:每一个集合类都需要一个对应的迭代器类,增加了系统的复杂性。
  • 2)不支持并发修改:在遍历集合的过程中,如果集合对象发生变化,可能会导致迭代器的行为不确定。

2.3 应用场景

  • 1)Java 中的 Iterator:Java 集合框架中的迭代器用于遍历集合元素。
  • 2)访问集合对象:需要遍历一个集合对象的各个元素时,可以使用迭代器模式。
  • 3)支持多种遍历方式:需要实现多种遍历算法时,可以使用迭代器模式。
  • 4)统一遍历接口:需要为不同的集合对象提供统一的遍历接口时,可以使用迭代器模式。

3 结构

  • 1)迭代器(Iterator):定义访问和遍历元素的接口。
  • 2)具体迭代器(ConcreteIterator):实现迭代器接口,负责具体的遍历操作。
  • 3)聚合(Aggregate):定义创建迭代器的接口。
  • 4)具体聚合(ConcreteAggregate):实现聚合接口,返回具体迭代器的实例。

4 实现

4.1 UML 类图

迭代器模式.jpg

4.2 代码示例

// 创建接口:迭代器
interface Iterator {
  public boolean hasNext();

  public Object next();
}

// 创建接口:容器
interface Container {
  public Iterator getIterator();
}

// 创建实现了 Container 接口的实体类,该类有实现了 Iterator 接口的内部类 NameIterator
class NameRepository implements Container {
  public String[] names = {"Robert", "John", "Julie", "Lora"};

  @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 (this.hasNext()) {
        return names[index++];
      }
      return null;
    }
  }
}

// 使用示例
public class IteratorPatternDemo {
  public static void main(String[] args) {
    // 使用 NameRepository 来获取迭代器,并打印名字
    NameRepository namesRepository = new NameRepository();
    for (Iterator iter = namesRepository.getIterator(); iter.hasNext(); ) {
      String name = (String) iter.next();
      System.out.println("Name : " + name);
    }
  }
}
  • 执行程序,输出结果:
Name : Robert
Name : John
Name : Julie
Name : Lora

5 总结

  • 迭代器模式通过引入迭代器接口和具体迭代器类,将集合对象的遍历操作与集合对象本身分离,实现了遍历算法的多样性和集合对象的独立性。迭代器模式适用于需要遍历集合对象、支持多种遍历方式以及提供统一遍历接口的场景。尽管迭代器模式增加了类的数量,但它在简化客户端代码、支持多种遍历方式和符合单一职责原则方面具有显著优势。在实际应用中,需要根据具体需求合理使用迭代器模式,以实现灵活可扩展的系统设计。