迭代器模式的思想是将集合或者容器类中的对象遍历的职责分离出来,使用迭代器来进行负责。从而能够在顺序遍历集合或者容器的时候,无需关注其内部的细节和实现。
实现:迭代器模式中的关键实现包含一下几点:
- 集合或者容器类中包含内部类(迭代器类需要感知集合类的保存数据的形式和集合中元素数量),为迭代器的实现类
- 集合或者容器类中包含获取迭代器类对象的方法
- 迭代器抽象接口中包含
hasNext
和next
方法,对应检测集合中是否还存在下一个元素的方法和获取下一个元素的方法。
使用场景:需要遍历集合或者容器类,但是却无需了解其内部实现的情况。最广泛的应用就是Java中的iterator在Map,Set等集合中的应用,使得遍历集合非常方便。
案例 背景迭代器是一种抽象的概念,所以迭代器模式在生活场景中基本没有对应场景,主要应用在软件设计中。所以我们直接举一个软件设计中的例子。我们需要保存若干个地点的名字,并且对这个集合进行遍历。
实现迭代器接口
public interface Iterator
{
boolean hasNext();
Object next();
}
容器接口
public interface Container
{
Iterator getIterator();
}
容器实现类
public class PlaceContainer implements Container
{
private String[] places;
public PlaceContainer(String[] places)
{
this.places = places;
}
@Override
public Iterator getIterator()
{
return new PlaceIterator();
}
private class PlaceIterator implements Iterator
{
private int index;
@Override
public boolean hasNext()
{
return index < places.length;
}
@Override
public Object next()
{
return places[index++];
}
}
}
验证程序
public class Demo
{
public static void main(String[] args)
{
String[] places = new String[]{"beijing", "tianjin", "xian", "shanghai", "guangzhou"};
PlaceContainer placeContainer = new PlaceContainer(places);
for (Iterator iterator = placeContainer.getIterator();iterator.hasNext();)
{
System.out.println(iterator.next());
}
}
}
输出
扩展beijing
tianjin
xian
shanghai
guangzhouProcess finished with exit code 0
java本身有提供Iterable
接口,其中包含iterator()
方法,可以用于为用户自定义的集合装备迭代器,非常方便。并且在此基础上,可以实现自定义集合类对于foreach关键字的支持。有兴趣的朋友可以看一下之前写过的一片博文《Java语言基础----------foreach原理》详细分析了foreach的实现原理。对于java本身的Iterable感兴趣的朋友,可以看一下java中各种Map或者Set的源码。
迭代器模式用于顺序遍历集合类,却不暴露集合内部逻辑,分离了数据遍历职责。