迭代器模式-Iterator

迭代器模式提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

一、类图

迭代器模式主要包含以下角色。

  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
  • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

二、示例

/**
 * 抽象的聚集。(可以理解为Java中的Collection接口)
 */
interface Aggregate {

    //返回迭代器
    Iterator iterator();

}

/**
 * 具体的聚集(可以理解为Java中的Collection的实现类)
 */
class ConcreteAggregate implements Aggregate {

    private Object[] list = {"zhangsan", "lisi", "wangwu", "zhaoliu"};

    public Object getElement(int index) {
        if (index < list.length) {
            return list[index];
        }
        //越界
        return null;
    }

    public int size() {
        return list.length;
    }

    /**
     * 由当前具体的聚集返回迭代器
     */
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }
}

/**
 * 抽象的迭代器
 */
interface Iterator {

    //移动到第一个元素
    void first();

    //是否还有元素
    boolean hasNext();

    //返回下一个元素
    Object next();

}

/**
 * 具体的迭代器
 */
class ConcreteIterator implements Iterator {

    private ConcreteAggregate concreteAggregate;
    private int index;
    private int size;

    public ConcreteIterator(ConcreteAggregate concreteAggregate) {
        this.concreteAggregate = concreteAggregate;
        size = concreteAggregate.size();
        index = 0;
    }

    @Override
    public void first() {
        index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < size;
    }

    @Override
    public Object next() {
        return concreteAggregate.getElement(index++);
    }
}

public class Client {

    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            Object element = iterator.next();
            System.out.println(element);
        }
    }

}

三、JDK中的迭代器

JDK中的集合的实现中,大量使用了迭代器模式。比如ArrayList源码实现中使用了迭代器,可以参考我的另外一篇博客:快速失败/报错机制 - fail-fast

 

……更多设计模式的内容,可以访问Refactoring.Guru

posted @ 2019-10-29 20:13  静水楼台/Java部落阁  阅读(274)  评论(0编辑  收藏  举报