设计模式- 迭代器模式(Iterator Pattern)结构|原理|优缺点|场景|示例

发布于:2024-04-26 ⋅ 阅读:(27) ⋅ 点赞:(0)

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种方法来顺序访问聚合对象(容器)中的元素,而又不暴露其实现细节。通过使用迭代器,用户可以从不同类型的聚合对象中以统一的方式遍历元素,而无需了解聚合物的内部结构或其存储方式。

结构:

  • Iterator(迭代器)接口: 定义了访问和遍历元素所需的抽象方法,如 hasNext()(是否有下一个元素)、next()(获取下一个元素)等。
  • ConcreteIterator(具体迭代器): 实现了迭代器接口,跟踪当前的遍历位置,并通过与聚合物的具体实现协作来提供对下一个元素的访问。
  • Aggregate(聚合)接口/抽象类: 定义了创建迭代器对象的接口方法,如 createIterator()
  • ConcreteAggregate(具体聚合): 具体的聚合类,提供了具体的元素存储结构,并实现了创建相应迭代器的方法。

原理:

迭代器模式的工作原理在于,它为聚合对象提供了一种标准的方式来访问内部元素,而无需暴露任何内部的数据结构。通过使用迭代器,用户可以通过简单的接口控制遍历过程,比如逐个获取元素,直到遍历结束。

优缺点:

  • 优点
    • 封装性好,隐藏了集合内部表示,简化了客户端代码。
    • 提供了统一的遍历各种聚合结构的方法,易于扩展和替换不同的数据结构。
    • 支持多种遍历方式,如正向、反向遍历等。
  • 缺点
    • 对于不同的聚合结构,可能需要编写不同的迭代器,增加了类的数量。
    • 迭代器模式只提供了一种线性访问方式,复杂的随机访问可能需要额外的设计。
    • 如果迭代器本身比较复杂,可能会增加系统的理解难度和维护成本。

场景:

  • 当需要遍历集合、数组或其他容器中的元素时。
  • 当希望提供多种遍历方式(顺序、条件等)时。
  • 在不希望暴露集合内部结构或实现细节的情况下,对外提供一致的访问接口。

代码示例(以Java为例)

 

// 聚合接口
public interface Collection {
    Iterator createIterator();
}

// 具体聚合类
public class ConcreteCollection implements Collection {
    private Object[] items;

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

    // ... 其他实现细节 ...
}

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

// 具体迭代器类
public class ConcreteIterator implements Iterator {
    private Collection collection;
    private int position = 0;

    public ConcreteIterator(Collection collection) {
        this.collection = collection;
    }

    @Override
    public boolean hasNext() {
        return position < collection.size();
    }

    @Override
    public Object next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return collection.getItem(position++);
    }

    // ... 其他实现细节 ...
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        Collection col = new ConcreteCollection();
        // ... 初始化集合 ...
        Iterator it = col.createIterator();
        while (it.hasNext()) {
            Object item = it.next();
            System.out.println(item);
        }
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到