一、定义
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
责任和职责:
Iterator(迭代器接口):
该接口必须定义实现迭代功能的最小定义方法集
比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类):
迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):
定义基本功能以及提供类似Iteratoriterator()的方法。
ConcreteAggregate(容器实现类):
容器接口的实现类。必须实现Iteratoriterator()方法。
二、场景展示
类图如下:
通用代码实现:
/** * 迭代器接口 * * @author arain.liu * */ public interface Iterator<T> { /** * 是否还有下一个元素 * * @return */ boolean hasNext(); /** * 返回当前位置的元素,并将位置移动到下一位 * * @return */ T next(); }
/** * * 具体迭代器 * * @author arain.liu * */ public class ConcreteIterator<T> implements Iterator<T> { private List<T> list = new ArrayList<>(); private int cursor = 0; public boolean hasNext() { return cursor != list.size(); } public T next() { T obj = null; if (this.hasNext()) { obj = this.list.get(cursor++); } return obj; } }
/** * 容器接口 * * @author arain.liu * */ public interface Aggregate<T> { /** * 添加一个元素 * * @param obj 元素对象 */ void add(T obj); /** * 移除一个元素 * * @param obj 元素对象 */ void remove(T obj); /** * 获取容器的迭代器 * * @return 迭代器对象 */ Iterator<T> iterator(); }
/** * 具体容器接口 * * @author arain.liu */ public class ConcreteAggregate<T> implements Aggregate<T> { private List<T> list = new ArrayList<>(); @Override public void add(T obj) { list.add(obj); } @Override public void remove(T obj) { list.remove(obj); } @Override public Iterator<T> iterator() { return new ConcreteIterator<>(); } }
/** * * Client类 * * @author arain.liu */ public class MainClass { public static void main(String[] args) { Aggregate<String> agt = new ConcreteAggregate<>(); agt.add("aLin"); agt.add("jack"); agt.add("yushao"); Iterator<String> itr = agt.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); } } }
迭代器优点:
1、实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
2、隐藏容器的实现细节。
3、为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
4、可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。