迭代器模式
1. 介绍
迭代器模式(Iterator Pattern)
是一种行为型模式。提供一个迭代器来实现对聚合对象中的元素的遍历。
简单理解:有一个集合,其中有许多元素,可以获取这个集合的不同迭代器来达到不同的遍历效果。java 中的 List、Set、Map 等集合类型都提供了获取其迭代器的接口。
优点
- 使用方便。要遍历容器,获取到它的迭代器就可以了,并且容器类型的改变对整体的影响较小。
- 封装性。将对象的内部结构和遍历的过程都封装在迭代器中了。
缺点
- 不适用于简单的遍历。如果是遍历一个数组,更方便的方法是使用for循环,而不是使用迭代器。
注意
由于容器和迭代器的联系太紧密了,所以很多语言的容器都已经提供了现成的迭代器。
2. 例子
NameRepository 中有一个字符串数组,其中保存了许多名字,要想遍历这些名字,可以调用接口获取一个 NameIterator 迭代器,使用这个迭代器就可以遍历这些名字了。
类图:
Iterator接口
这个接口定义了 hasNext() 和 next() 这两个方法,这个接口是迭代器需要实现的接口。
package iteratorPattern;
/**
* 迭代器接口
* @author jxd
* @since 2021-06-12
*/
public interface Iterator {
/**
* 判断是否还有下一个元素
* @return 是否还有下一个元素
*/
public boolean hasNext();
/**
* 获取下一个元素
* @return 获取下一个元素
*/
public Object next();
}
Container接口
容器接口,因为 NameRepository 是一个存储了许多名字的容器,所以 NameRepository 实现了 Container 接口,这个接口定义了一个 getIterator() 方法
package iteratorPattern;
/**
* 容器接口
* @author jxd
* @since 2021-06-12
*/
public interface Container {
/**
* 获取迭代器
* @return 一个迭代器对象
*/
public Iterator getIterator();
}
NameRepository类
名字存储库类,实现了 Container 接口,其中有一个内部类 NameIterator ,它是遍历这个 NameRepository 中的所有名字的迭代器。
package iteratorPattern;
/**
* 名字存储库
* @author jxd
* @since 2021-06-12
*/
public class NameRepository implements Container {
/**
* 用来存储名字的字符串数组
*/
public String[] names = { "Robert", "John", "Julie", "Lora" };
/**
* 返回一个NameIterator
*/
@Override
public Iterator getIterator() {
return new NameIterator();
}
/**
* 内部类NameIterator(名字迭代器类)实现了Iterator接口
* @author jxd
* @since 2021-06-12
*/
private class NameIterator implements Iterator {
/**
* 记录当前下标
*/
int index;
@Override
public boolean hasNext() {
if (index < names.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (this.hasNext()) {
return names[index++];
}
return null;
}
}
}
测试类:
package iteratorPattern;
import org.junit.Test;
/**
* 迭代器模式的测试类
* @author jxd
* @since 2021-06-12
*/
public class TestJ {
@Test
public void test1() {
NameRepository nameRepository = new NameRepository();
Iterator iterator = nameRepository.getIterator();
while(iterator.hasNext()) {
System.out.println("Name: " + (String)iterator.next());
}
}
}
运行结果:
Name: Robert
Name: John
Name: Julie
Name: Lora
3. 总结
迭代器模式就是通过获取一个容器的迭代器来遍历这个容器中的元素。