定义
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
以List为例我们都知道List最常用的有两种结构,一种是链表一种是数组,数组通过下标去遍历元素,而链表则通过访问下个节点去遍历元素,也就是说这两个遍历元素的方式是不同的如果我们要使用就需要我们熟悉我们要用的容器的数据结构,但这种方式并不可取。增加了学习成本已经降低的程序的通用性和可扩展性。因此我们引入迭代器模式来隐藏具体的遍历细节,从而通过一个方式就可以遍历所有容器元素
结构和实现
结构
- Iterator抽象迭代器
负责定义访问和遍历元素的接口,基本固定三个方法:first()获取第一个元素,next()访问下个元素,hasNext()是否还要下一个元素 - ConcreteIterator具体迭代器
实现迭代器接口,完成容器元素的遍历 - Aggregate抽象容器
容器角色负责提供创建具体迭代器接口的角色,在Java是iterator()方法 - ConcreteAggerate具体容器
具体容器实现容器接口定义的方法,创建出容纳迭代器的对象
实现
Iterator抽象迭代器
public interface Iterator {
public Object First();
public Object Next();
public boolean hasNext();
}
Aggregate抽象容器
public interface Aggerator {
public Iterator iterator();
}
ConcreteIterator具体迭代器
public class ConcreteIterator implements Iterator{
private ConcreteAggerator aggerator;
private int index = 0;
public ConcreteIterator(ConcreteAggerator _aggerator){
this.aggerator = _aggerator;
}
@Override
public Object First() {
return aggerator.getAt(0);
}
@Override
public Object Next() {
if(index < aggerator.getLength()){
return aggerator.getAt(index++);
}
return null;
}
@Override
public boolean hasNext() {
if(index < aggerator.getLength()){
return true;
}
return false;
}
}
ConcreteAggerate具体容器
public class ConcreteAggerator implements Aggerator {
List<Object> list;
public ConcreteAggerator(){
list = new ArrayList<>();
}
public void addObject(Object object){
list.add(object);
}
public Object getAt(int i){
return list.get(i);
}
public int getLength(){
return list.size();
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
}
测试
public class IteratorClient {
public static void main(String[] args) {
Aggerator aggerator = new ConcreteAggerator();
aggerator.addObject("1");
aggerator.addObject("2");
aggerator.addObject("3");
Iterator iterator = aggerator.iterator();
while(iterator.hasNext()){
System.out.println(iterator.Next());
}
}
}
总结
迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样做的好处就是既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。