迭代器模式:按照顺序一次遍历集合中所有的元素
优点:依序遍历元素,不会存在漏掉的情况
实现:模拟一个公交车售票员售票的场景,不管车上乘客是什么人,坐车一律需要买票
1、抽象迭代器、抽象集合类
/**
* 迭代抽象类
*/
public abstract class Iterator {
/**
* 获取第一个对象
*/
public abstract Object first();
/**
* 获取下一个对象
*/
public abstract Object next();
/**
* 是否最后一个
*/
public abstract Boolean idDone();
/**
* 获取当前对象
*/
public abstract Object currentItem();
}
/**
* 集合抽象类
*/
public abstract class Aggregate {
/**
* 创建迭代器
*/
public abstract Iterator createIterator();
}
2、具体迭代器、具体集合类
/**
* 具体迭代器
*/
public class ConcreteIterator extends Iterator{
//集合类
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate){
this.aggregate = aggregate;
}
/**
* 获取第一个对象
*/
public Object first(){
return aggregate.getItem(0);
}
/**
* 获取下一个对象
*/
public Object next(){
Object next = null;
current++;
if (current < aggregate.count()){
next = aggregate.getItem(current);
}
return next;
}
/**
* 是否最后一个
*/
public Boolean idDone(){
return current < aggregate.count() ? false : true;
}
/**
* 获取当前对象
*/
public Object currentItem(){
return aggregate.getItem(current);
}
}
/**
* 具体集合类
*/
public class ConcreteAggregate extends Aggregate{
private List<Object> item = new ArrayList<>();
public Iterator createIterator(){
return new ConcreteIterator(this);
}
public int count(){
return item.size();
}
public Object getItem(int number){
return item.get(number);
}
public void setItem(Object value){
item.add(value);
}
}
3、测试类
/**
* 测试迭代器模式
*/
public class TestIterator {
public static void main(String [] args){
ConcreteAggregate concreteAggregate = new ConcreteAggregate();
concreteAggregate.setItem("乘客1");
concreteAggregate.setItem("乘客2");
concreteAggregate.setItem("乘客3");
concreteAggregate.setItem("公司员工");
concreteAggregate.setItem("小偷");
Iterator iterator = concreteAggregate.createIterator();
Object item = iterator.first();
System.out.println(MessageFormat.format("第一个乘客{0}", item));
while (!iterator.idDone()){
System.out.println(MessageFormat.format("{0}请买票" , iterator.currentItem()));
iterator.next();
}
}
}
测试结果:
迭代器模式就是我们最常用的foreach,现在已经封装的很成熟了,不需要自己去写,在此只是了解一下其原理