虚心使人进步,骄傲使人落后。
一、迭代器模式介绍
迭代器模式属于设计模式中行为型模式的一种。迭代器模式提供了一种方法用于访问聚合对象中的各个元素,而又不暴露该对象的内部表示。
二、迭代器模式的优点
使用迭代器模式可以使得聚合对象中元素的聚合方式改变时,访问者不用修改访问的方式。
例如:聚合对象中元素的聚合方式由数组改为链表,如果不使用迭代器模式,那么访问者遍历聚合对象中元素的代码就要修改,如果使用迭代器模式,只需要修改对应的迭代器的方法就可以了,不用修改访问者的代码。
三、示例
有一个聚合对象班级(Class),班级中有很多学生(Student)。如果要访问班级里的所有学生,就可以使用迭代器方式实现。
四、代码实现
Iterator(迭代器接口):
/**
* 迭代器接口
*
* @author ZhengNC
* @date 2020/9/9 22:40
*/
public interface Iterator<E> {
/**
* 是否有下一个元素
*
* @return
*/
boolean hasNext();
/**
* 获取下一个元素
*
* @return
*/
E next();
}
Class(班级):
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;
/**
* 班级
*
* @author ZhengNC
* @date 2020/9/9 22:47
*/
public class Class {
private List<Student> studentList = new ArrayList<>();
/**
* 添加学生
*
* @param student
*/
public void addStudent(Student student){
studentList.add(student);
}
/**
* 移除学生
*
* @param student
*/
public void removeStudent(Student student){
studentList.remove(student);
}
/**
* 获取学生迭代器
*
* @return
*/
public Iterator<Student> iterator(){
return new Itr();
}
/**
* 学生迭代器
*/
private class Itr implements Iterator<Student>{
/**
* 当前迭代下标
*/
private int cursor;
/**
* 预期迭代数量
*/
private int expectedSize = studentList.size();
private Itr() {}
@Override
public boolean hasNext() {
return cursor != expectedSize;
}
@Override
public Student next() {
checkExpectedSize();
return studentList.get(cursor++);
}
/**
* 检查预期迭代数量是否有变化
*/
private void checkExpectedSize(){
if (expectedSize != studentList.size()) {
throw new ConcurrentModificationException();
}
}
}
}
Student(学生):
/**
* 学生
*
* @author ZhengNC
* @date 2020/9/9 22:47
*/
public class Student {
private String name;
public Student(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
TestIterator(测试迭代器模式):
/**
* 测试迭代器模式
*
* @author ZhengNC
* @date 2020/9/9 23:13
*/
public class TestIterator {
public static void main(String[] args) {
Class cla = new Class();
cla.addStudent(new Student("张三"));
cla.addStudent(new Student("李四"));
cla.addStudent(new Student("王五"));
cla.addStudent(new Student("赵六"));
Iterator<Student> iterator = cla.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
五、代码执行结果
Student{name=‘张三’}
Student{name=‘李四’}
Student{name=‘王五’}
Student{name=‘赵六’}