设计模式(4)-迭代器模式Itarator

思想:提 供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
场景:访 问一个聚合对象的内容而无需暴露它的内部表示。支持对聚合对象的多种遍历。为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
实现:其 实就是定义一个逻辑上类似一个指针的迭代类。专门用于这种迭代工作。如果对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).可以为容器或其子容器实现不同的迭代方法或多个迭代方法。