迭代器模式现在已经是一个没落的设计模式了,为什么这样说呢?因为大多数语言现在已经内置了迭代器这种工具。比如Java中的Java.util.Iterator这个接口。在Java1.5之后更是增加了Java.util.Iterable。
定义:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象内部的细节。简单的说迭代器就类似于数据库中的游标,可以在一个容器内上下翻滚,遍历所有的它需要查看的元素。
迭代器是为容器服务的。
迭代器模式类图:
迭代器模式中出现的角色:
- Iterator抽象迭代器 :负责定义访问和遍历元素的接口,此接口中固定有三个方法:first()获得第一个元素;next()访问下一个元素;isDone()是否已经访问到了最底(在Java中叫做hasNext()方法);
- ConcreteIterator具体迭代器:实现抽象迭代器接口,完成遍历;
- Aggregate抽象容器:容器角色提供具体迭代器角色的接口,必须提供一个类似createIterator()的方法(在Java中为iterator()方法);
- ConcreteAggregate具体容器:实现抽象容器中的方法,创建出容纳迭代器的对象。
迭代器模式通用模板:
//抽象迭代器
public interface Iterator{
//遍历到每一个元素
public Object next();
//是否已经便利到了最后一个元素
public boolean hasNext();
//删除当前指向的元素
public boolean remove();
}
//具体迭代器
public class ConcreateIterator implements Iterator{
private Vector vector=new Vector();
//定义当前游标
public int cursor=0;
public ConcreateIterator(Vector vector) {
super();
this.vector = vector;
}
@Override
public Object next() {
Object result=null;
if(this.hasNext()) {
result=this.vector.get(this.cursor++);
}
else {
result=null;
}
return result;
}
@Override
public boolean hasNext() {
if(this.cursor==this.vector.size()) {
return false;
}
else {
return true;
}
}
@Override
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 ConcreateAggregate implements Aggregate{
//容纳元素的容器
private Vector vector=new Vector();
@Override
public void add(Object object) {
this.vector.add(object);
}
@Override
public void remove(Object object) {
this.remove(object);
}
@Override
public Iterator iterator() {
return new ConcreateIterator(this.vector);
}
}
//情景类
public class Client{
public static void main(String[] args) {
//声明容器
Aggregate agg=new ConcreateAggregate();
//产生对象数据放进去
agg.add("abc");
agg.add("def");
agg.add("1234");
//遍历
Iterator it=agg.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
但在Java开发中尽量不必写迭代器,因为Java提供的Iterator就够用了。