概述
首先简述2个概念
- UML 中的 类图 (Class Diagram) 用于表示类、接口、实例等之间的静态关系
- 只要在一个类中持有另外一个类的实例, 无论是一个还是多个, 它们之间就是聚合关系
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
下边通过模拟List来说明Java中的迭代器, 详细实现请阅读jdk源码。
实现
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 List 接口, 实现了 Container 接口的实体类将负责实现 Iterator 接口, 类图如下
Iterator接口
1 2 3 4 5 6 7 8 9 10 11
|
public interface Iterator<E> {
boolean hasNext();
E next(); }
|
List接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public interface List<E> {
Iterator<E> iterator();
}
|
ArrayList实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
public class ArrayList<E> implements List<E> {
transient Object[] elementData; private int size;
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } }
public boolean add(E e) { elementData[size++] = e; return true; }
@Override public Iterator iterator() { return new Itr(); }
private class Itr implements Iterator<E> {
Itr() {}
int cursor;
@Override public boolean hasNext() { return cursor < size; }
@Override public E next() { if (this.hasNext()) { return (E) elementData[cursor++]; }
return null; } } }
|
演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class IteratorDemo {
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(16); list.add("张三"); list.add("李四"); list.add("王五");
Iterator iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
} }
|
执行程序, 输出结果
最后
本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。