定义
迭代器模式就是遍历集合的一种方式。比如去游乐园排队买票,售票员根据排队的顺序一次售票。
用法示例
Aggregate接口,表示集合能力的接口,实现该接口可以保存多个元素。
public interface Aggregate {
Iterator iterator();
}
Iterator接口,表示迭代能力的接口,实现该接口可以遍历集合中的元素。
public interface Iterator {
/**
* 判断是否存在下一个元素
*/
boolean hasNext();
/**
* 返回hasNext为true的元素
*/
Object next();
}
Person类,集合中元素的实体类
public class Person {
private String personName;
public Person(String personName) {
this.personName = personName;
}
public String getPersonName() {
return personName;
}
}
PersonQueue类,排队的队列,需要拥有排很多人的能力,实现Aggregate接口
import java.util.ArrayList;
import java.util.List;
public class PersonQueue implements Aggregate {
private List<Person> personList;
private int last;
public PersonQueue(int maxSize) {
this.personList = new ArrayList<>(maxSize);
}
public Person getPerson(int index) {
return personList.get(index);
}
public void addPerson(Person person) {
this.personList.add(last, person);
last++;
}
public int getQueueLength() {
return last;
}
@Override
public Iterator iterator() {
return new PersonQueueIterator(this);
}
}
PersonQueueIterator用于遍历排队队列的类,需要迭代能力,实现Iterator接口。
public class PersonQueueIterator implements Iterator {
private PersonQueue personQueue;
private int index;
public PersonQueueIterator(PersonQueue personQueue) {
this.personQueue = personQueue;
this.index = 0;
}
@Override
public boolean hasNext() {
if (index < personQueue.getQueueLength()) {
return true;
}
return false;
}
@Override
public Object next() {
Person person = personQueue.getPerson(index);
index++;
return person;
}
}
Main用于测试的类。
public class Main {
public static void main(String[] args) {
PersonQueue personQueue = new PersonQueue(3);
personQueue.addPerson(new Person("小秋"));
personQueue.addPerson(new Person("小灰"));
personQueue.addPerson(new Person("小白"));
Iterator iterator = personQueue.iterator();
while (iterator.hasNext()) {
Person person = (Person)iterator.next();
System.out.println(person.getPersonName());
}
}
}
使用理由
引入迭代器可以实现集合的遍历与具体的实现分离。
比如:
while (iterator.hasNext()) {
Person person = (Person)iterator.next();
System.out.println(person.getPersonName());
}
这里的遍历并没有调用PersonQueue里的方法,可以很方便的更换PersonQueue的实现方式,这次是用List存储对象,下次可能使用数组或者其他的结构,PersonQueue的调用方是没有感知的,不影响调用方的正常使用。