定义
又叫游标(Cursor)模式,提供一种方法访问一个容器(container)对象中的各个元素,而又不暴露该对象的内部细节
角色
迭代器角色(Iterator):负责定义访问和遍历元素的接口
具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置
容器角色(Container):负责提供创建具体迭代器角色的接口
具体容器角色(Concrete Container):实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关
优点
- 它支持以不同的方式遍历一个聚合对象
- 在同一个聚合上可以有多个遍历
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码
缺点
- 新增一个聚合类,就要相应的实现一个迭代器类,类的个数增多
适用场景
- 访问一个对象的内容,又不想暴露对象的内部结构
- 对对象进行遍历
类图
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public interface Aggregat {
public Iterator createIterator();
public void add(Object obj);
}
package com.vapy.behavior.Iterator;
import java.util.Vector;
/**
*
* @author vapy 2016年8月27日
*
*/
public class ConcreteAggregat implements Aggregat {
private Vector<Object> vector = null;
public Vector<Object> getVector() {
return vector;
}
public void setVector(Vector<Object> vector) {
this.vector = vector;
}
public ConcreteAggregat(){
vector = new Vector<Object>();
}
@Override
public void add(Object obj) {
vector.add(obj);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(vector);
}
}
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public interface Iterator {
public Object next();
public Object currentItem();
public boolean isDone();
public Object first();
}
package com.vapy.behavior.Iterator;
import java.util.Vector;
/**
*
* @author vapy 2016年8月27日
*
*/
public class ConcreteIterator implements Iterator {
private int cursor = -1;
private Vector<Object> vector = null;
public ConcreteIterator(final Vector<Object> vector){
this.vector = vector;
}
@Override
public Object first() {
return vector.get(0);
}
@Override
public Object next() {
cursor ++;
return vector.get(cursor);
}
@Override
public Object currentItem() {
return vector.get(cursor);
}
@Override
public boolean isDone() {
if(cursor >= this.vector.size() - 1){
return true;
} else {
return false;
}
}
}
package com.vapy.behavior.Iterator;
/**
*
* @author vapy 2016年8月27日
*
*/
public class Client {
public static void main(String[] args) {
final Aggregat agg = new ConcreteAggregat();
agg.add("abc");
agg.add("def");
final Iterator iterator = agg.createIterator();
System.out.println(iterator.first());
while(!iterator.isDone()){
System.out.println(iterator.next());
}
}
}
本文代码可在github查看:点击此处