Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(提供一种方法,访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。)
迭代器模式介绍
- 迭代器是为容器服务的
- 所谓容器就是能容纳对象的所有的类型的统称。例如Collection集合类型、Set类型等等
- 类图:
我提供了遍历容器的方便性,容器只要管理增减就可以了,需要遍历时交给我。下面具体分析类图:
- Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上有固定的三个方法:
- first()获取第一个元素
- next()获取下一个元素
- isDone()是否访问完了。Java中是hasNext()。
- ConcreteIterator具体迭代器:实现迭代器接口,完成容器元素遍历。
- Aggregate抽象容器:负责提供创建具体的迭代器角色接口。
- ConcreteAggregate具体容器:具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。
迭代器模式分析
优点:
- 支持以不同的方法遍历一个聚合。
- 简化了聚合的接口。
- 在同一个聚合上可以有多个遍历。
迭代器之实现
Golang
Java
首先是抽象迭代器:
public interface Iterator{
//遍历下一个元素
public object next();
//是否已经到最后一个元素
public boolean hasNext();
//删除当前指向的元素
public boolean remove();
}
接下来是具体的迭代器实现代码:
public class ConcreteIterator implements Iterator{
private Vector vector = new Vector();
//定义当前游标
public int cursor = 0;
@SuppressWarnings("unchecked")
public ConcreteIterator(Vector vector){
this.vector = vector;
}
//判断是否是最后一个
public boolean hasNext(){
if(this.cursor == this.vector.size()){
return false;
}
else
return true;
}
//返回下一个元素
public Object next(){
Object result = null;
if(this.hasNext()){
result = this.vector.get(this.cursor++);
}
else
result = null;
return result;
}
//删除当前元素
public boolean remove(){
this.vector.remove(this.cursor);
return true;
}
}
然后是抽象容器类:
public interface Aggregate{
//是容器必有的元素增加
public void add(Object object);
//减少元素
public void remove(Object object);
//由迭代器遍历
public Iterator iterator():
}
最后是具体容器的实现类:
public class ConcreteAggregate implements Aggregate{
//容器对象的容器
private Vector vector = new Vector();
//增加一个元素
public void add(Object object){
this.vector.add(object);
}
//减少一个元素
public void remove(Object object){
this.remove(object);
}
//返回迭代对象
public void add(Object object){
return new ConcreteIterator(this.vector);
}
}
以上就是具体的通用方法的实现了。
迭代器模式应用场合
虽然我这种模式不再使用,但是迭代这种容器却是使用的很频繁的,经常编程的你们想必也见到过很多~下面就来介绍一下具体的使用场合,其实我可以用来:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即:支持多态迭代)。