一种顺序访问集合或者容器中对象元素的方法
以下是安检传送行李为例
//行李
public class Baggage {
private String name;//行李名称
public Baggage(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//迭代器接口
public interface IMyIterator<E> {
E next();//遍历下一个元素
boolean hasNext();//是否有下一个元素
}
//实现迭代器接口
public class MyIteratorImpl<E> implements IMyIterator<E> {
private List<E> list;//需要迭代的集合
private int cursor;//游标,即集合中元素的位置
private E element;//集合中的元素
private int size;//集合中的大小
public MyIteratorImpl(List<E> list) {
this.list = list;
this.size = list.size();
}
@Override
public E next() {//遍历下一个元素
E element = list.get(cursor);//根据游标获取当前元素
cursor++;
return element;
}
@Override
public boolean hasNext() {//是否还有下一个元素
return cursor != size;
}
}
//传送带(容器集合)
public interface IBaggageCollection {
void add(Baggage baggage);//添加元素
void remove(Baggage baggage);//移除元素
int size();//集合大小
IMyIterator<Baggage> iterator();//构建一个迭代器对象
}
//容器集合的实现
public class BaggageCollectionImpl implements IBaggageCollection {
private List list;
public BaggageCollectionImpl() {
this.list = new ArrayList<>();
}
@Override
public void add(Baggage baggage) {
list.add(baggage);
}
@Override
public void remove(Baggage baggage) {
list.remove(baggage);
}
@Override
public int size() {
return list.size();
}
@Override
public IMyIterator<Baggage> iterator() {
return new MyIteratorImpl<Baggage>(list);//构造一个我们自定义的迭代器返回
}
}
//测试
public class TestIterator {
public static void main(String[] args) {
IBaggageCollection iBaggageCollection = initBaggage();//初始化一个自定义集合
System.out.println("当前对象元素个数为:" + iBaggageCollection.size() + "个");
IMyIterator<Baggage> it = iBaggageCollection.iterator();//获得自自定义迭代器
while (it.hasNext()){//开始迭代容器内元素
Baggage baggage = it.next();
System.out.println(baggage.getName());
}
}
private static IBaggageCollection initBaggage() {
IBaggageCollection iBaggageCollection = new BaggageCollectionImpl();
for (int i=0;i<10;i++){//初始化 10 个箱子进集合等待迭代
Baggage box = new Baggage("箱子" + (i+1));
iBaggageCollection.add(box);
}
return iBaggageCollection;
}
}
使用场景
1.访问一个集合对象的内容而不想暴露它的内部表示
2.为遍历不同的集合提供一个统一的访问接口
优点
1.解耦集合与循环
2.无需关心具体迭代行为
3.迭代不同的集合同一接口
缺点
便利简单数据结构麻烦