迭代器模式

一、迭代器模式定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。

二、迭代器模式结构
迭代器模式_第1张图片
迭代器模式涉及到以下几个角色:

●  抽象迭代器(Iterator)角色:此抽象角色定义出遍历元素所需的接口。

●  具体迭代器(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。

●  聚集(Aggregate)角色:此抽象角色给出创建迭代器(Iterator)对象的接口。

●  具体聚集(ConcreteAggregate)角色:实现了创建迭代器(Iterator)对象的接口,返回一个合适的具体迭代器实例。

●  客户端(Client)角色:持有对聚集及其迭代器对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
  抽象聚集角色类,这个角色规定出所有的具体聚集必须实现的接口。迭代器模式要求聚集对象必须有一个工厂方法,也就是createIterator()方法,以向外界提供迭代器对象的实例。

public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
具体聚集角色类,实现了抽象聚集角色类所要求的接口,也就是createIterator()方法。此外,还有方法getElement()向外界提供聚集元素,而方法size()向外界提供聚集的大小等。

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 void operation(){
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();
}
}
public static void main(String[] args) {
Client client = new Client();
client.operation();
}
}

你可能感兴趣的:(迭代器模式)