定义和特点
提供一种方法顺序访问一个聚合对象中各个元素。
Collection,List,Set,Map中都包含了迭代器,包括foreatch循环,都是迭代;
这里相当于是写迭代器的部分源码
优点
- 访问一个聚合对象的内容而无须暴露内部表示
- 便利任务交给迭代器完成,简化了聚合类
- 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合和迭代器类比较方便,并不需要修改原有的代码
- 封装性比较好,为遍历不同的聚合结构提供一个统一的接口
缺点
增加了类的个数,在一定程度上增加了系统的复杂性
结构与实现
- 抽象聚合(Aggregate):定义储存,添加,删除聚合对象以及创建迭代器对象的接口;
- 具体聚合(ConcreteAggregate):实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator):定义访问和遍历聚合元素的接口,通常包含hasNext(),first(),next()方法。
- 具体迭代器(ConcreIterator):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置
抽象聚合
public interface Aggregate {
public void add(Object obj);
public void remove(Object obj);
public Iterator getIterator();
}
抽象迭代器
public interface Iterator {
public Object first();
public Object next();
public boolean hasNext();
}
具体聚合类
public class ConcreteAggregate implements Aggregate{
public List<Object> list =new ArrayList<>();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator getIterator() {
//因为相当于写源码,所以这里是抽象迭代器的,并不是Java.util的
return new ConcreteIterator(list);
}
}
具体的迭代器
public class ConcreteIterator implements Iterator{
private List<Object> list = null;
private int index = -1;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@Override
public Object first() {
//取第一个
return list.get(0);
}
@Override
public Object next() {
//下一个
Object obj = null;
if (this.hasNext()){
obj = list.get(++index);
}
return obj;
}
@Override
public boolean hasNext() {
if(index < list.size() -1){
return true;
}else {
return false;
}
}
}
调用:
public class IteratorMain {
public static void main(String[] args) {
Aggregate ag =new ConcreteAggregate();
ag.add("AAAA");
ag.add("BBBB");
ag.add("CCCC");
ag.add("DDDD");
System.out.println("聚合对象内容有:");
Iterator it = ag.getIterator();
while (it.hasNext()){
Object ob = it.next();
System.out.println(ob.toString());
}
System.out.println("第一个:"+it.first());
}
}