Java 设计模式——迭代器模式

模式定义

迭代器模式(Iterator Pattern),属于行为型模式,是 Java非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器在Java中有专门的Iterator接口,Java集合类一般都实现了该接口,也就是说都支持通过迭代器来进行顺序元素访问。

模式示例

迭代器模式实现的关键就是迭代接口的定义了,一般需要定义以下方法:

  • hashNext(),是否存在下一个元素;
  • next(),获取下一个元素;

下面通过示例来实现迭代器模式,需要定义聚合对象,迭代器。下例主要完成对一组姓名信息的迭代输出(只为演示使用)。

定义迭代器接口

1
2
3
4
public interface Iterator {
boolean hasNext();
Object next();
}

定义Container接口,用于获取迭代器

1
2
3
public interface Container {
Iterator getIterator();
}

定义聚合对象,并实现迭代器接口

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
public class NameRepository implements Container {
public String names[] = {"Ethan", "Jason", "Karen", "Ascii"};

@Override
public Iterator getIterator() {
return new NameIterator();
}

private class NameIterator implements Iterator {

int index;

@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}

@Override
public Object next() {
if(hasNext()){
return names[index++];
}
return null;
}
}
}

编写客户端进行迭代访问

1
2
3
4
5
6
7
8
9
10
11
12
13
public class IteratorPatternDemo {

public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();

Iterator iterator = namesRepository.getIterator();

while (iterator.hasNext()) {
String name = (String)iterator.next();
System.out.println("Name : " + name);
}
}
}

输出结果如下

1
2
3
4
Name : Ethan
Name : Jason
Name : Karen
Name : Ascii

注意:在需要对集合遍历并删除指定元素时,用迭代器可以很好的避免边移除边遍历造成的问题

模式总结

从Java集合类大都实现了Iterator这一点可以看出,迭代器模式肯定会给设计者带来诸多好处。它主要解决对聚合对象的遍历问题,可以通过定义不同的迭代器来完成不同方式的遍历。

优缺点

  • 优点
    1. 它支持以不同的方式遍历一个聚合对象;
    2. 迭代器简化了聚合类;
    3. 在同一个聚合上可以有多个遍历;
    4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  • 缺点
    1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

使用场景

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口。

注意事项

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。