Zer0e's Blog

设计模式之迭代器模式

字数统计: 680阅读时长: 2 min
2020/08/27 Share

前言

本篇来讲讲迭代器模式。

正文

概念

迭代器模式属于行为型模式,这种模式用于顺序访问集合对象中的元素,但是没有暴露内部的表示。例如java中的iterator。
一般来讲迭代器模式中有以下几个角色:

  • 迭代器(Iterator):抽象接口,一般来说有几个方法,next()取得下一个元素,hasNext()判断是否有下一个元素,remove()移除元素。
  • 具体迭代器,即实现迭代器接口的具体类
  • 容器角色(Aggregate/Container):也是个接口,一般有一个iterator()提供迭代器,java中有Collection,list,set等接口。
  • 具体容器角色:即容器角色的实现类,如java中实现list的ArrayList等。

实现

我们来实现一个简单的迭代器。
先定义简单迭代器:

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

之后定义容器接口,里面有一个getIterator获取迭代器。

1
2
3
public interface Container {
public 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
public class keyRepository implements Container{
public String[] keys = {"101","102","103"};
@Override
public Iterator getIterator() {
return new KeyIterator();
}

private class KeyIterator implements Iterator{
int index = 0;
@Override
public boolean hasNext() {
return index < keys.length;
}

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

最后测试一下

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
keyRepository keyRepository = new keyRepository();

for (Iterator iterator = keyRepository.getIterator(); iterator.hasNext();){
System.out.println("key is " + iterator.next());
}
}
}

优缺点

迭代器模式的优点在于简化了遍历的方式,对于数组或者列表我们还可以通过下标来获取对象,而如果对于一些无法通过下标获取对象的存储类型,我们就需要迭代器来顺序获取对象。其次我们可以实现多种遍历方式,如正序或者逆序。再者我们增加新的迭代器时无修修改原有的代码。
而缺点在于由于迭代器模式存储与遍历数据的方法是分开的,因此需要增加新的容器时就需要添加对应的迭代器类,增加复杂性。

总结

迭代器模式与容器是相互作用的,一般来说实现一个容器就要实现这个容器的迭代器,在java中的collection,list,set,map等都有它自己的迭代器。我们可以使用增强型for循环再配合迭代器进行遍历,十分方便。所以迭代器模式就是当我们需要实现一个新的容器时,就需要引入这个模式,来给这个容器提供一个迭代器。

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 概念
    2. 2.2. 实现
    3. 2.3. 优缺点
  3. 3. 总结