迭代器提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。
迭代器模式有两个角色,一个是迭代器,一个是聚合器,Java或则c#中的Collection,List,Set,Map就是聚合器。
优点:
简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。
满足开闭原则,如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。
缺点:
具体迭代器实现的算法对外不可见,因此不利于调试和维护。
对于某些小型、简单的集合对象来说,使用迭代器模式可能会显得过于复杂,增加了代码的复杂性。
代码示例
/**
* @author Created by njy on 2023/6/25
* 学生实体类
*/
@Data
public class Student {
private String name;
private Integer age;
public Student(String name,Integer age){
this.age=age;
this.name=name;
}
}
import java.util.Iterator;
/**
* @author Created by njy on 2023/6/25
* 抽象迭代器(Iterator):学生迭代器
* 实现Iterator接口
* 负责定义访问和遍历元素的接口,例如提供hasNext()和next()方法。
*/
public interface StudentIterator extends Iterator<Student> {
}
/**
* @author Created by njy on 2023/6/25
* 具体迭代器(Concrete iterator):
* 实现抽象迭代器定义的接口,负责实现对元素的访问和遍历。
*/
public class StudentListIterator implements StudentIterator{
private List<Student> students;
private int index;
public StudentListIterator(List<Student> students) {
this.students = students;
this.index = 0;
}
//检查是否还有下一个元素
@Override
public boolean hasNext() {
return (index < students.size());
}
//返回下一个元素
@Override
public Student next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Student student = students.get(index);
index++;
return student;
}
}
/**
* @author Created by njy on 2023/6/25
* 抽象聚合器(Aggregate):学生聚合器
* 提供创建迭代器的接口,例如可以定义一个iterator()方法。
*/
public interface StudentAggregate {
//用于创建具体的迭代器对象
StudentIterator iterator();
void add(Student student);
}
/**
* @author Created by njy on 2023/6/25
* 具体聚合器(ConcreteAggregate):班级列表
* 实现抽象聚合器定义的接口,负责创建具体的迭代器对象,并返回该对象。
*/
public class ClassList implements StudentAggregate{
private List<Student> students = new ArrayList<>();
//创建迭代器对象
@Override
public StudentIterator iterator() {
return new StudentListIterator(students);
}
//向班级名单中添加学生信息
@Override
public void add(Student student) {
students.add(student);
}
}
/**
* @author Created by njy on 2023/6/25
* 迭代器模式测试类
*/
@SpringBootTest
public class TestIterator {
@Test
void testIterator(){
ClassList classList = new ClassList();
// 添加学生信息
classList.add(new Student("张三", 18));
classList.add(new Student("李四", 19));
classList.add(new Student("王五", 20));
// 获取迭代器,遍历学生信息
StudentIterator iterator = classList.iterator();
while(iterator.hasNext()) {
Student student = iterator.next();
System.out.println("学生姓名:" + student.getName() + ",学生年龄:" + student.getAge());
}
}
}