基本概念
迭代器模式,提供一种方法以便顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器为遍历聚集结构提供了如开始、下一个、是否结束、当前项等统一接口。
结构图
上图摘自《大话设计模式》
应用场景
当需要访问一个聚合对象,而且不管这些对象是什么,都需要遍历的时候,应该考虑迭代器模式。
源码示例
1.定义一个迭代器接口
package com.spook.iterator;
/**
* 迭代器接口
*/
public interface Iterator {
public Object first();
public Object next();
public Object currentItem();
public boolean hasNext();
public boolean isDone();
}
2.定义一个抽象聚集接口
package com.spook.iterator;
/**
* 抽象聚集接口
*/
public interface Aggregate {
public Iterator getIterator();
}
3.定义一个迭代器的实现类
package com.spook.iterator;
/**
* 迭代器的实现类
*/
public class ConcreteIterator implements Iterator {
public String cityNames[] = { "NewYork", "London", "Tokyo", "Hongkong" };
int index = 0;
@Override
public Object first() {
// TODO Auto-generated method stub
if (cityNames.length > 0) {
return cityNames[0];
} else {
return null;
}
}
@Override
public Object next() {
// TODO Auto-generated method stub
if (this.hasNext()) {
return cityNames[index++];
} else {
return null;
}
}
@Override
public Object currentItem() {
// TODO Auto-generated method stub
if (index < cityNames.length) {
return cityNames[index];
} else {
return null;
}
}
@Override
public boolean isDone() {
// TODO Auto-generated method stub
if (index >= cityNames.length) {
return true;
} else {
return false;
}
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if (index < cityNames.length) {
return true;
} else {
return false;
}
}
}
4.聚集的实现类
package com.spook.iterator;
/**
* 聚集的实现类
*/
public class ConcreteAggregate implements Aggregate {
@Override
public Iterator getIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator();
}
}
5.测试类
package com.spook.iterator;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteAggregate concreteAggregate = new ConcreteAggregate();
Iterator iterator = concreteAggregate.getIterator();
System.out.println("第一个元素:" + iterator.first());
System.out.println("---------------------");
while (iterator.hasNext()) {
System.out.println(iterator.next());
System.out.println("是否完成遍历:" + iterator.isDone());
}
}
}
运行测试类输出如下内容:
第一个元素:NewYork
---------------------
NewYork
是否完成遍历:false
London
是否完成遍历:false
Tokyo
是否完成遍历:false
Hongkong
是否完成遍历:true