迭代器模式-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
不积跬步,无以至千里。不积小流,无以成江海!