引用百科
迭代器模式(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; } }3、迭代接口
//抽象迭代接口 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++; } } }5、客户端Client测试
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)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。