设计模式(二十三):迭代器模式(Iterator Pattern)

Published on 2024-04-11 16:26 in 分类: 博客 with 狂盗一枝梅
分类: 博客

一、迭代器模式定义

迭代器模式提供了一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。(Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.)

迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型、Set类型等,迭代器模式就是为解决遍历这些容器中的元素而诞生的。

迭代器模式的通用类图如下

迭代器模式通用类图

针对上面类图,下面有个大体的实现源码

迭代器接口

interface Iterator {
    boolean hasNext();
    Object next();
}

聚合对象接口

interface Aggregate {
    Iterator createIterator();
}

具体迭代器

class ConcreteIterator implements Iterator {
    private List<Object> elements;
    private int position;

    public ConcreteIterator(List<Object> elements) {
        this.elements = elements;
        this.position = 0;
    }

    public boolean hasNext() {
        return position < elements.size();
    }

    public Object next() {
        Object element = elements.get(position);
        position++;
        return element;
    }
}

具体聚合对象

class ConcreteAggregate implements Aggregate {
    private List<Object> elements;

    public ConcreteAggregate() {
        this.elements = new ArrayList<>();
    }

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

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

客户端代码

public class Main {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.addElement("Element 1");
        aggregate.addElement("Element 2");
        aggregate.addElement("Element 3");

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

输出

Element 1
Element 2
Element 3

二、JDK中的迭代器

我们知道JDK自带迭代器,比如我们常用的ArrayList或者HashSet,直接调用iterator方法就可以获取到Iterator对象,从而实现对整个集合的迭代,其类图如下所示

迭代器模式-第 2 页.drawio

你还真别说,不看不知道,一看吓一跳,这集合框架里面的类看类图真的有设计的美感,啧啧。。。

无论是List还是HashSet,它们的顶层接口都是Iterable接口,这表示它们是可迭代的,调用iterator方法就可以获取迭代对象。

具体的实现方法,在ArrayList中和HashSet类中实现,总的来说,都是针对各自不同的数据结构,实现相同的Iterator接口。

这样就完成了集合类迭代器API的统一。

image-20240411162004843

三、最佳实践

迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发。

做Java开发,尽量不要自己写迭代器模式!省省吧,使用Java提供的Iterator一般就能满足你的要求了。


参考文档:https://refactoringguru.cn/design-patterns/iterator

《设计模式之禅》第20章 《迭代器模式》



END.


#设计模式
目录