1 迭代器模式介绍
迭代器模式是一种行为设计模式,它允许客户端通过迭代器来遍历集合对象中的元素,而无需了解集合对象底层的实现细节。
迭代器模式将遍历算法与集合对象分离,使得对集合的遍历可以独立于集合的实现方式。通过使用迭代器模式,可以实现对一个集合对象的多种遍历方式。通常,迭代器模式包括一个迭代器接口、一个具体迭代器类和一个聚合对象接口。
迭代器是学习 Java 语言的基础,没有迭代器,集合类的遍历就成了问题,正是因为有迭代器的存在,才能更加优雅的使用 foreach 语法。
📌 场景
迭代器模式通常用于遍历含有多个元素的集合,例如列表或数组等。它可以提供灵活的遍历方式,使得遍历代码与集合的实现分离,从而提高代码的可维护性和可扩展性。如果你有一个需要遍历的集合,同时又希望避免与集合的具体实现细节耦合,那么就可以考虑使用迭代器模式。
📌 优缺点
优点:迭代器模式的优点是可以提供一种不同于传统循环语句的访问集合类中元素的方式,可以更好的解耦客户端和集合类的代码,同时也可以方便地扩展迭代器的功能。
缺点:需要额外实现一个迭代器类,增加了代码的复杂度。
📌 for 循环中的迭代器:
List<String> list = Arrays.asList("AAA", "BBB", "CCC");
// 使用 foreach 语法糖进行迭代,依次获取每一个元素
for (String s : list) {
// 打印元素
System.out.println(s);
}
编译之后的代码如下:
List<String> list = Arrays.asList("AAA", "BBB", "CCC");
// 这里本质是通过 List 生成的迭代器来遍历每个元素的
Iterator var2 = list.iterator();
// 判断是否还有元素可以迭代,没有就返回false
while(var2.hasNext()) {
// 通过 next 方法得到下一个元素,每调用一次,迭代器会向后移动一位
String s = (String)var2.next();
// 打印元素
System.out.println(s);
}
2 迭代器模式实现
根据 JDK 提供的迭代器接口来设计一个迭代器:
📌 1.定义数组集合
/**
* 数组集合<br>
* 实现 Iterable 接口表示此类是支持迭代的
*/
public class YinyuCollection<T> implements Iterable<T> {
/**
* 使用数组来存放数据
*/
private final T[] array;
/**
* 构造器私有,自己用
* @param array 数组
*/
public YinyuCollection(T[] array) {
this.array = array;
}
/**
* 使用静态方法获取对象
* @param array 数组
* @return 数组集合对象
* @param <T> 实体类
*/
public static <T> YinyuCollection<T> of(T[] array) {
return new YinyuCollection<>(array);
}
/**
* 实现 iterator 方法,此方法会返回一个迭代器,用于迭代我们集合中的元素
* @return 迭代器
*/
@Override
public Iterator<T> iterator() {
return new ArrayIterator();
}
/**
* 这里自定义 ArrayIterator,注意别用静态,需要使用对象中存放的数组
*/
public class ArrayIterator implements Iterator<T> {
// 这里通过指针表示当前的迭代位置
private int index = 0;
/**
* 判断是否还有下一个元素
* @return 结果
*/
@Override
public boolean hasNext() {
// 如果指针大于或等于数组最大长度,就不能再继续了
return index < array.length;
}
/**
* 返回当前指针位置的元素并向后移动一位
* @return
*/
@Override
public T next() {
// 正常返回对应位置的元素,并将指针自增
return array[index++];
}
}
}
📌 2.调用
public class Client {
public static void main(String[] args) {
// 定义数组
String[] arr = new String[]{"AAA", "BBB", "CCC", "DDD"};
// 使用数组集合处理数组
YinyuCollection<String> collection = YinyuCollection.of(arr);
// 使用 foreach 语法糖遍历,最后还是会变成迭代器调用
for (String s : collection) {
System.out.println(s);
}
}
}
编译后的代码为:
public class Client {
public Client() {
}
public static void main(String[] args) {
String[] arr = new String[]{"AAA", "BBB", "CCC", "DDD"};
YinyuCollection<String> collection = YinyuCollection.of(arr);
// 首先获取迭代器,实际上就是调用我们实现的 iterator 方法
Iterator var3 = collection.iterator();
while(var3.hasNext()) {
// 使用 next() 方法不断向下获取
String s = (String)var3.next();
System.out.println(s);
}
}
}
控制台输出:
AAA
BBB
CCC
DDD
以上就实现了自定义迭代器来遍历数组。