思想:提 供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
场景:访 问一个聚合对象的内容而无需暴露它的内部表示。支持对聚合对象的多种遍历。为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
实现:其 实就是定义一个逻辑上类似一个指针的迭代类。专门用于这种迭代工作。如果对C++ STL火锅功夫 学习的朋友一定不会陌生啦。实际使用过一下就明白了。除了功能之外,他给我最大的感受就是他让我熟悉的for语句,变长了好多。^-^
迭代器模式由以下角色组成:
1 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。
迭代器模式UML图如下:
迭代器模式在java中的集合框架中用的非常极致:
1 2 3 4 5 6 7 8 9 10 11 12 13
| //迭代器 ,该接口提供了迭代遍历的通用方法 public interface Iterator { boolean hasNext(); Object next(); void remove(); } //容器迭代化接口,凡是实现此接口的集合容器距可以生成相应的迭代器 public interface Iterable<T>{ //产生迭代器,将容器对象转换为迭代器对象 Iterator<T> interator(); } //java集合框架的根接口,该接口继承了容器迭代化接口,因此java中的集合都可以被迭代 public interface Collection<E> extends Iterable<E>
|
自定义迭代器:
以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
| public class MyIterator implements Iterable { //存放数据的集合 private ArrayList list; //负责创建具体迭代器角色的工厂方法 public Iterator iterator() { return new Itr(list); } //作为内部类的具体迭代器角色 private class Itr implements Iterator { ArrayList myList; int position = 0; public Itr(ArrayList list) { this.myList = list; } public Object next() { Object obj = myList.get(position); position++; return obj; } public boolean hasNext() { if (position >= myList.size()) { return false; } else { return true; } } //不支持remove操作 public void remove(){ throw new UnsupportedOperationException( "Alternating MyIterator does not support remove()"); } } }
|
此处可以为MyIterator 指定被迭代对象的构造器。
Iterator模式的优点:
(1).实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
(2).隐藏容器的实现细节。
(3).为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
(4).可以为容器或其子容器实现不同的迭代方法或多个迭代方法。