一、模式名
迭代器, Iterator
二、解决的问题
迭代器主要用于按照某种顺序遍历访问某个集合,提出的目的是为了解耦对集合遍历过程和集合对象。访问集合的方法有很多,使用迭代器可以自定义遍历集合元素的方法,每当新增一种访问方法时,不需要修改集合类,只需新增新的访问集合的迭代类,保证了开闭原则。
三、解决方案
迭代器的UML如下图所示
代码如下
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 集合类中每个具体的集合都有对应的迭代器