行为模式之迭代器模式
迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。
定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
类图如下所示。
迭代器模式有以下4个角色。
- 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
- 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
- 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。
Iterator.java
public interface Iterator { public Object next(); public boolean hasNext(); }
ConcreteIterator.java
public class ConcreteIterator implements Iterator { private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg) { this.agg = agg; size = agg.size(); index = 0; } @Override public Object next() { if (index < size) { return agg.getElement(index++); } else { return null; } } @Override public boolean hasNext() { return index < size; } }
Aggregate.java
public interface Aggregate { public void add(Object obj); public Iterator createIterator(); }
ConcreteAggregate.java
public class ConcreteAggregate implements Aggregate { private Vector vector = new Vector(); @Override public void add(Object obj) { this.vector.add(obj); } public Object getElement(int index) { if (index < this.vector.size()) { return vector.get(index); } else { return null; } } public int size() { return vector.size(); } @Override public Iterator createIterator() { return new ConcreteIterator(this); } }
Client.java
public class Client { public static void main(String[] args) { // 定义聚集对象 Aggregate agg = new ConcreteAggregate(); agg.add("张三"); agg.add("李四"); agg.add("王五"); // 遍历 Iterator iterator = agg.createIterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
运行结果如下所示。
张三 李四 王五
优点:
- 简化了访问容器元素的操作,具备一个统一的遍历接口。
- 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。
缺点:
- 给使用者一个序列化的错觉,从而产生错误。
应用场景:
- 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。
摘自:
青岛东合信息技术有限公司 . 设计模式(Java版) . 电子工业出版社,2012,133-138.