迭代器模式

迭代器模式

介绍

基本介绍

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

迭代器模式属于行为型模式。

注意

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

作用

遍历一个聚合对象

使用场景

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口。

案例

package top.lldwb.iteratorPattern;

import java.util.ArrayList;
import java.util.List;

// 抽象迭代器接口
interface Iterator {
    boolean hasNext(); // 是否还有下一个元素

    Object next(); // 获取下一个元素
}

// 具体迭代器类
class ConcreteIterator implements Iterator {
    private List<Object> list; // 存储数据的集合
    private int index = 0; // 当前迭代器的位置

    ConcreteIterator(List<Object> list) {
        this.list = list;
    }

    public boolean hasNext() {
        return index < list.size();
    }

    public Object next() {
        if (this.hasNext()) {
            return list.get(index++);
        }
        return null;
    }
}

// 抽象聚合类
interface Aggregate {
    void add(Object obj); // 添加元素到集合

    void remove(Object obj); // 从集合中移除元素

    Iterator createIterator(); // 创建迭代器
}

// 具体聚合类
class ConcreteAggregate implements Aggregate {
    private List<Object> list = new ArrayList<>();

    public void add(Object obj) {
        list.add(obj);
    }

    public void remove(Object obj) {
        list.remove(obj);
    }

    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.add("元素A");
        aggregate.add("元素B");
        aggregate.add("元素C");

        Iterator iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

注释:

  1. Iterator 是抽象迭代器接口,定义了两个方法:hasNext() 用于判断是否还有下一个元素,next() 用于获取下一个元素。

  2. ConcreteIterator 是具体迭代器类,实现了抽象迭代器接口。它维护一个数据集合 list 和一个位置索引 index,通过 hasNext()next() 方法实现对集合的遍历。

  3. Aggregate 是抽象聚合类,定义了三个方法:add() 用于添加元素到集合,remove() 用于从集合中移除元素,createIterator() 用于创建迭代器对象。

  4. ConcreteAggregate 是具体聚合类,实现了抽象聚合类。它内部使用 List 来存储数据,并提供了实现抽象聚合类中的三个方法。

  5. 客户端代码中首先创建具体聚合类 ConcreteAggregate,并添加一些元素。然后通过 createIterator() 方法获取迭代器对象,并使用迭代器遍历输出集合中的元素。

优缺点

优点

  1. 它支持以不同的方式遍历一个聚合对象。
  2. 迭代器简化了聚合类。
  3. 在同一个聚合上可以有多个遍历。
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点

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