迭代器模式(iterator),又称为游标(cursor)模式,是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。
模式的职责
提供一种可以遍历聚合对象的方式。
模式的结构
聚合对象:存储数据
迭代器:遍历数据
模式的实现
public interface MyIterator {
void first();//将游标指向第一个元素()
void next();//将游标指向下一个元素
Object getCurrentObj();
boolean hasNext();//判断是否有下一个元素
//这两个可以有也可以没有
boolean isfirst();//判断是否是第一个元素
boolean isLast();//判断是否是最后一个元素
}
public class ConcreteMyaggregate {
//承载需要迭代的容器
private List<Object> list = new ArrayList<Object>();
public ConcreteMyaggregate(List<Object> list){
super();
this.list =list;
}
public void addObject(Object obj){
list.add(obj);
}
public void removeObject(Object obj){
list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
//外部获得迭代器的类的方法
public MyIterator createIterator(){
return new ConcreteItertor();
}
//使用内部类定义迭代器,可以直接使用外部类的属性
private class ConcreteItertor implements MyIterator{
//迭代器的游标
private int cursor;
public void first() {
cursor = 0;
}
//迭代器的真正实现
public Object getCurrentObj() {
return list.get(cursor);
}
public boolean hasNext() {
if(cursor<list.size()){
return true;
}
return false;
}
public boolean isLast() {
return cursor == (list.size()-1)?true:false;
}
public boolean isfirst() {
return cursor == 0?true:false;
}
public void next() {
if(cursor<list.size())
cursor++;
}
}
}
//客户端调用
public class Client {
public static void main(String[] args) {
//创建容器,往容器中放入对象
ConcreteMyaggregate cma = new ConcreteMyaggregate(null);
cma.addObject("a");
cma.addObject("b");
cma.addObject("c");
//创建迭代器,取出对象
MyIterator iter = cma.createIterator();
//只要还有对象,就取出对象,并把游标往下一个
while(iter.hasNext()){
System.out.println(iter.getCurrentObj());
iter.next();
}
}
}
其他说明
这个实现案例是用正向遍历的迭代器,其实也可以实现逆向遍历的迭代器(就是每次都把游标向前一位的那种)。
JDK内置的迭代器(List/Set)里面也是用的这种方式。