迭代器模式

一、模式名

迭代器, Iterator

二、解决的问题

迭代器主要用于按照某种顺序遍历访问某个集合,提出的目的是为了解耦对集合遍历过程和集合对象。访问集合的方法有很多,使用迭代器可以自定义遍历集合元素的方法,每当新增一种访问方法时,不需要修改集合类,只需新增新的访问集合的迭代类,保证了开闭原则。

三、解决方案

迭代器的UML如下图所示

clipboard

代码如下

interface Collection<E> {
    void add(E e);
    E get(int i);
    int size();
    Iterator iterator();
}

class ConcreteCollection<E> implements Collection<E> {

    private Object[] eles;
    private int currentIndex;

    public ConcreteCollection(int length) {
        eles = new Object[length];
        currentIndex = 0;
    }

    @Override
    public void add(E e) {
        if (currentIndex < eles.length) {
            eles[currentIndex++] = e;
            return;
        }

        System.out.println("超过数组长度");
    }

    @Override
    public E get(int i) {
        if (i < 0 || i >= eles.length) {
            return null;
        }

        return (E) eles[i];
    }

    @Override
    public int size() {
        return currentIndex;
    }

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


interface Iterator<E> {
    E next();
    boolean hasNext();
}

class ConcreteIterator<E> implements Iterator<E> {

    private Collection<E> collection;
    private int cursor;

    public ConcreteIterator(Collection<E> collection) {
        this.collection = collection;
        cursor = 0;
    }

    @Override
    public E next() {
        if (hasNext()) {
            return collection.get(cursor++);
        }

        return null;
    }

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


public class IteratorClient {
    public static void main(String[] args) {
        Collection<String> collection = new ConcreteCollection<>(10);

        for (int i = 0; i < 10; ++i) {
            collection.add(i + "");
        }

        Iterator<String> concreteIterator = new ConcreteIterator<>(collection);

        while (concreteIterator.hasNext()) {
            String next = concreteIterator.next();
            System.out.println(next);
        }
    }
}

如果后续我们需要对集合增加新的遍历方法,只需要实现对该集合的迭代器即可,不需要修改原有集合类。

应用场景:

Java 集合类中每个具体的集合都有对应的迭代器

posted @ 2019-06-19 00:15  锢浪熟阳  阅读(140)  评论(0编辑  收藏  举报