设计模式-迭代器模式

迭代器模式:

       迭代器模式(Iterator Pattern)是属于行为型的设计模式,它提供了一种统一的方法来遍历不同的数据结构(如数组、集合或容器),而无需暴露这些数据结构的内部表示。通过使用迭代器,客户端代码可以访问数据集对象,而无需了解底层的数据存储方式。

角色与结构:

1 Iterator(迭代器)

  • 定义了访问和遍历元素的接口,通常包含 hasNext()(判断是否有下一个元素)、next()(获取下一个元素)等方法。

2 ConcreteIterator(具体迭代器)

  • 实现 Iterator 接口的具体迭代器类,负责跟踪当前遍历的位置,并在调用 next() 时返回相应的元素。
  • 具体迭代器与具体的聚合类相关联,知道如何遍历该聚合中的元素。

3 Aggregate(聚合)

  • 定义创建迭代器对象的接口,例如一个 createIterator() 方法,用于生成创建Iterator 对象。
  • 聚合对象是多个对象的组合,可以是列表、集合或其他容器类型。

4 ConcreteAggregate(具体聚合)

  • 提供了创建 ConcreteIterator 的实现,并实现了管理其内部元素的逻辑。

工作原理:

  • 客户端调用聚合对象上的 createIterator() 方法获得一个迭代器实例。
  • 客户端通过调用迭代器的 hasNext() 和 next() 等方法遍历聚合中的所有元素,而不直接访问聚合的内部状态。

示例代码:

迭代器模式java示例代码:

// 聚合接口
public interface Aggregate {
    void add(Object element);
    void remove(Object element);
    Iterator createIterator();
}

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

    @Override
    public void add(Object element) {
        elements.add(element);
    }

    @Override
    public void remove(Object element) {
        elements.remove(element);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
}

// 迭代器接口
public interface Iterator {
    boolean hasNext();
    Object next();
}

// 具体迭代器类
public class ConcreteIterator implements Iterator {
    private ConcreteAggregate aggregate;
    private int current;

    public ConcreteIterator(ConcreteAggregate aggregate) {
        this.aggregate = aggregate;
        current = 0;
    }

    @Override
    public boolean hasNext() {
        return current < aggregate.elements.size();
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return aggregate.elements.get(current++);
        } else {
            throw new NoSuchElementException("No more elements.");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Aggregate agg = new ConcreteAggregate();
        agg.add("Element1");
        agg.add("Element2");
        agg.add("Element3");

        Iterator iterator = agg.createIterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
} 
  

说明:在上面代码ConcreteAggregate 类是一个具体的聚合类,它维护了一个元素列表。ConcreteIterator 类是针对 ConcreteAggregate 的具体迭代器,能够遍历聚合内的元素。客户端只需通过迭代器进行遍历,不需要关心元素是如何存储和组织的。

优点:

  • 封装性:隐藏了数据集对象的内部表示,修改数据集对象不会影响到使用它的客户端代码。
  • 一致性:为不同类型的聚合提供了统一的遍历方式。
  • 支持多种遍历方式:可以通过定义不同类型的迭代器支持正向遍历和反向遍历遍历方式。

应用场景:

  • Java 中的 Collection 框架提供的 Iterator 接口及其子接口和实现类。
  • 需要遍历数据结构但不想暴露其内部细节的情况。

你可能感兴趣的:(设计模式,迭代器模式)