引用百科
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
适用性
访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口
迭代子模式涉及的角色:
● 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
● 具体迭代子(RealIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
● 聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
● 具体聚集(RealAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
● 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
具体实现:
相关代码
1、抽象聚集类
//抽象聚集角色类
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代子对象的接口
*/
public abstract Iterator createIterator();
}
2、具体抽象聚集类实现
//具体聚集角色类
public class RealAggregate extends Aggregate {
private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public RealAggregate(Object[] objArray) {
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new RealIterator(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();
}
4、具体迭代实现类
//具体迭代子角色类
public class RealIterator implements Iterator {
// 持有被迭代的具体的聚合对象
private RealAggregate agg;
// 内部索引,记录当前迭代到的索引位置
private int index = 0;
// 记录当前聚集对象的大小
private int size = 0;
public RealIterator(RealAggregate 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 operation() {
Object[] objArray = { "One", "Two", "Three", "Four", "Five", "Six" };
// 创建聚合对象
Aggregate aggregate = new RealAggregate(objArray);
// 循环输出聚合对象中的值
Iterator it = aggregate.createIterator();
while (!it.isDone()) {
System.out.println(it.currentItem());
it.next();
}
}
public static void main(String[] args) {
operation();
}
}
通过以上简单代码实现了迭代模式,同时循环迭代输出了数组中的内容!
迭代模式效果:
它支持以不同的方式遍历一个聚合。
迭代器简化了聚合的接口。
在同一个聚合上可以有多个遍历。
迭代子模式的优点
1)迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。
2)每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。
3)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。