迭代器模式
认识
迭代子模式是对象的行为模式。迭代子模式可以顺序地访问一个聚合对象中的元素而不必暴露聚合对象的内部表示
JAVA聚合对象是实现了共同的java.util.Collection接口的对象,还有数组(最基本的聚合对象)
思考
迭代器的关键思想就是把对聚合对象的遍历和访问从聚合对象中分离出来,放入单独的迭代器中处理。这样聚合对象职责会简单些,聚合对象和迭代器可以独立、灵活的扩展。
本质是:控制访问聚合对象中的元素。
使用场景
当想要访问一个聚合对象,而又不想暴露它的内部表示的时候,可以让客户端通过迭代器访问,而不去关心聚合对象的内部实现
增加一种遍历聚合对象的方式的时候可以使用迭代器模式
为一类对象提供相同的遍历方式的时候使用迭代器模式,如List接口下所有的实现类都可以使用Itorator进行遍历。
优缺点
优点:更好的封装性,简化了聚合对象
缺点:
UML图
- 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
- 具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
- 聚合(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
- 具体聚合(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
- 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
代码实现
可以参考List接口下实现类迭代器的实现
//抽象聚合对象类
public abstract class Aggregate {
//工厂方法,创建相应迭代子对象的接口
public abstract Iterator createIterator();
}
//聚合对象子类
public class ConcreteAggregate extends Aggregate {
private Object[] objArray = null;
// 创建迭代器,传入聚合对象的具体内容
public ConcreteAggregate(Object[] objArray){
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
//取值方法:向外界提供聚集元素
public Object getElement(int index){
if(index < objArray.length){
return objArray[index];
}else{
return null;
}
}
//取值方法:向外界提供聚集的大小
public int size(){
return objArray.length;
}
}
//迭代器接口
public interface Iterator {
//迭代方法:移动到第一个元素
public void first();
//迭代方法:移动到下一个元素
public void next();
//迭代方法:是否为最后一个元素
public boolean isDone();
//迭代方法:返还当前元素
public Object currentItem();
}
//具体迭代器
public class ConcreteIterator implements Iterator {
//持有被迭代的具体的聚合对象
private ConcreteAggregate agg;
//内部索引,记录当前迭代到的索引位置
private int index = 0;
//记录当前聚集对象的大小
private int size = 0;
public ConcreteIterator(ConcreteAggregate agg){
this.agg = agg;
this.size = agg.size();
index = 0;
}
//迭代方法:返还当前元素
@Override
public Object currentItem() {
return agg.getElement(index);
}
//迭代方法:移动到第一个元素
@Override
public void first() {
index = 0;
}
//迭代方法:是否为最后一个元素
@Override
public boolean isDone() {
return (index >= size);
}
// 迭代方法:移动到下一个元素
@Override
public void next() {
if(index < size)
{
index ++;
}
}
}
//客户端
public class Client {
public static void main(String[] args) {
Object[] objArray = {"One","Two","Three","Four","Five","Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//获取聚合对象的迭代器
Iterator it = agg.createIterator();
//循环输出聚合对象中的值
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
}