
5 种创建型模式7 种结构型模式11 种行为型模式定义
提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示
迭代器模式主要包含以下角色:
类图如下:

代码如下:
public interface StudentIterator {
//判断是否还有元素
boolean hasNext();
//获取下一个元素
Student next();
}public class StudentIteratorImpl implements StudentIterator {
private final List<Student> list;
private int position = 0;//用来记录遍历时的位置
public StudentIteratorImpl(List<Student> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return position < list.size();
}
@Override
public Student next() {
//从集合中获取指定位置的元素
Student currentStudent = list.get(position);
position++;
return currentStudent;
}
}public interface StudentAggregate {
//添加学生功能
void addStudent(Student stu);
//删除学生功能
void removeStudent(Student stu);
//获取迭代器对象功能
StudentIterator getStudentIterator();
}public class StudentAggregateImpl implements StudentAggregate {
// 学生列表
private final List<Student> list = new ArrayList<>();
@Override
public void addStudent(Student stu) {
list.add(stu);
}
@Override
public void removeStudent(Student stu) {
list.remove(stu);
}
//获取迭代器对象
@Override
public StudentIterator getStudentIterator() {
return new StudentIteratorImpl(list);
}
}public class Client {
public static void main(String[] args) {
//创建聚合对象
StudentAggregateImpl aggregate = new StudentAggregateImpl();
//添加元素
aggregate.addStudent(new Student("张三","001"));
aggregate.addStudent(new Student("李四","002"));
aggregate.addStudent(new Student("王五","003"));
aggregate.addStudent(new Student("赵六","004"));
//1,获取迭代器对象
StudentIterator iterator = aggregate.getStudentIterator();
//2,遍历
while(iterator.hasNext()) {
//3,获取元素
Student student = iterator.next();
System.out.println(student.toString());
}
}
}优点
多种遍历方式 不同的迭代器来替换原有迭代器即可改变遍历算法缺点
迭代器模式在JAVA的很多集合类中被广泛应用
List<String> list = new ArrayList<>();
//list.iterator()方法返回的肯定是Iterator接口的子实现类对象
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}单列集合都使用到了迭代器,我们以ArrayList举例来说明

Iterator 接口的具体迭代器对象具体的来看看 ArrayList的代码实现
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 下一个要返回元素的索引
int lastRet = -1; // 上一个返回元素的索引
int expectedModCount = modCount;
Itr() {}
//判断是否还有元素
public boolean hasNext() {
return cursor != size;
}
//获取下一个元素
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}iterator() 方法中返回了一个实例化的Iterator对象Itr是ArrayList一个内部类,它实现了 Iterator 接口并重写了其中的抽象方法注意:
java.util.Iterable并实现其中的iterator()方法使其返回一个 java.util.Iterator 的实现类就可以了