概述
迭代器模式(Iterator Pattern)是一种行为型设计模式,它允许客户端通过一个逐个访问集合元素的接口来访问一个聚合对象中的每个元素,而不需要直接暴露该对象的内部表示方式。迭代器模式将遍历逻辑与聚合对象分离,使得这两部分可以独立地变化,从而使设计更加灵活。迭代器模式包含两个核心角色:迭代器和聚合对象。
迭代器是一个对象,它实现了访问聚合对象中元素的接口。迭代器具有两个基本的操作:访问下一个元素和判断是否还有下一个元素。聚合对象是若干个元素的集合,它通常提供一个工厂方法,用于返回它的迭代器。聚合对象可以是一个数组、一个链表、一个哈希表、一棵树等等。
优点:
- 简化了集合类,集合类不再需要自己实现遍历方法,简化了集合类的职责;
- 对于客户端而言,使用起来更加方便和简单;
- 对于聚合对象,迭代器模式可以将其具体实现细节隐藏起来。
缺点:
- 相对于直接访问集合元素,迭代器的访问速度可能较慢;
- 迭代器模式增加了系统设计复杂度,例如需要额外编写迭代器类等。
适用场景:
- 访问聚合对象的内容而不需要暴露它的内部表示;
- 支持对聚合对象的多种遍历方式;
- 统一遍历方式,简化了集合类。
实际应用场景:
迭代器模式在 Java 语言中得到了广泛的应用,例如 Java 中的集合类就实现了迭代器模式。以 ArrayList 为例,我们可以使用如下方式来访问集合中的元素:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("orange");
list.add("banana");
// 使用迭代器遍历集合元素
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
示例
下面的实例代码展示了如何使用迭代器模式遍历一个学生列表。
首先定义一个接口 StudentIterator,定义了遍历学生列表的方法:
// 迭代器接口
interface StudentIterator {
boolean hasNext(); // 判断是否有下一个学生
Student next(); // 获取下一个学生
}
然后定义一个学生类 Student:
// 学生类
class Student {
private String name;
private int id;
public Student(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
接着定义一个聚合类 StudentList,它包含了一个用于存储学生列表的数组,并提供了一个工厂方法 createIterator,用于返回该聚合对象的迭代器实例:
// 聚合类
class StudentList {
private Student[] students;
private int index = 0;
public StudentList(List<Student> students) {
this.students = new Student[students.size()];
for (int i = 0; i < students.size(); i++) {
this.students[i] = students.get(i);
}
}
public StudentIterator createIterator() {
return new ListIterator();
}
// 列表迭代器
private class ListIterator implements StudentIterator {
@Override
public boolean hasNext() {
return index < students.length;
}
@Override
public Student next() {
Student student = students[index];
index++;
return student;
}
}
}
最后,我们可以使用这些类来遍历学生列表:
public class Client {
public static void main(String[] args) {
// 创建学生列表
List<Student> list = new ArrayList<>();
list.add(new Student("Alice", 1001));
list.add(new Student("Bob", 1002));
list.add(new Student("Charlie", 1003));
// 创建聚合类
StudentList studentList = new StudentList(list);
// 遍历学生列表
StudentIterator iterator = studentList.createIterator();
while (iterator.hasNext()) {
Student student = iterator.next();
System.out.println(student.getName() + " " + student.getId());
}
}
}
输出结果:
Alice 1001
Bob 1002
Charlie 1003